Android:在 AsyncTask 中传递字符串参数?
Posted
技术标签:
【中文标题】Android:在 AsyncTask 中传递字符串参数?【英文标题】:Android: Passing String parameters in AsyncTask? 【发布时间】:2012-05-29 11:03:31 【问题描述】:我正在实现一个 android 应用程序来加载 RSS 提要。在我决定添加一个新屏幕来显示两个按钮并尝试将字符串值传递给 AsyncTask 之前,它工作得非常好。想法是这样的:屏幕将显示两个按钮供用户选择。一旦用户单击其中一个按钮,它将调用 AsyncTask 以及字符串 value(url) 来读取RSS(url),然后通过 displayRSS(url) 显示 rss 提要。 readRSS(url) 将相应地加载 RSS 提要。
我的代码如下:
import java.util.List;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.widget.TextView;
import android.widget.Toast;
public class RSSProActivity extends Activity
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.rss);
startLoadRSS();
private void startLoadRSS()
new RSS_Load().execute();
//
private void preReadRSS()
Toast.makeText(this, "Reading RSS, Please wait.", Toast.LENGTH_LONG).show();
private StringBuffer readRSS(String url)
//depends on the inputs, will set the String value accordingly. It should be "url" but using the default value at the moment.
String urlStr = "http://www.bom.gov.au/fwo/IDZ00059.warnings_vic.xml";
AndroidSAXFeedParser saxFeedParser = new AndroidSAXFeedParser(urlStr);
List<RSSItem> parse = saxFeedParser.parse();
StringBuffer sb = new StringBuffer();
sb.append(parse.size()+" items found");
for(RSSItem item:parse)
sb.append(item.getTitle()+"posted at "+item.getDate());
sb.append(item.getDescription());
return sb;
private void displayRSS()
StringBuffer sb = readRSS(url);
TextView textView = new TextView(this);
textView.setText(sb.toString());
setContentView(textView);
Toast.makeText(this, "SUCCESS", Toast.LENGTH_LONG).show();
//AsyncTask
public class RSS_Load extends AsyncTask<Void, Void, Void>
@Override
protected void onPreExecute()
super.onPreExecute();
preReadRSS();
@Override
protected Void doInBackground(Void... arg0)
readRSS();
// should be readRSS(url) here
return null;
@Override
protected void onProgressUpdate(Void... values)
//super.onProgressUpdate(values);
// updateProgressBar(values[0]);
@Override
protected void onPostExecute(Void result)
super.onPostExecute(result);
// dismissProgressBar();
// should be displayRSS(url) here
displayRSS();
我正在尝试更改 RSS_Load extends AsyncTask 中的值,但它给了我编译错误。所以我更改了受保护的 Void doInBackground(String... url) 然后将 url 传递给 readRSS(url) 但它也不起作用。我应该如何做到这一点?
提前致谢!
【问题讨论】:
“它也不起作用”是什么意思? @K-ballo 表示它仍然给我编译错误。但我设法使用 CaseyB 提供的答案通过将 arg0[0] 传递给 readRSS() 来修复它。 如果我的答案对您有用,那么您选择单击旁边的复选标记以接受答案。 【参考方案1】:... 表示它实际上是在传递该类型的数组。因此,如果您将其更改为:
protected Void doInBackground(String... arg0)
你需要这样做:
@Override
protected Void doInBackground(String... arg0)
readRSS(arg0[0]);
// should be readRSS(url) here
return null;
【讨论】:
感谢您的回答!还有一个问题,我应该如何调用 AsyncTask?最初我是这样做的: startLoadRSS();私人无效 startLoadRSS() 新 RSS_Load().execute();这是否意味着我可以通过 startLoadRSS(url) 调用它? @princess_blackforest:private void startLoadRSS(String url) new RSS_Load().execute(url);
。提示:为您的AsyncTask
创建一个显式构造函数,该构造函数接受执行所需的所有参数。这样一来,意外传入错误变量或根本不传入就变得更加困难。它还避免了查看doInBackground(...)
的实际实现来了解它需要什么数据。
请... 将您的arg0
更改为有意义的...几去。
@Phix 同意,我就这样离开了,以便尽可能少地从 OP 中改变
是的,抱歉,没有直接针对你 :-)以上是关于Android:在 AsyncTask 中传递字符串参数?的主要内容,如果未能解决你的问题,请参考以下文章
将字符串值分配给来自AsyncTask的onPostExecute方法的活动字符串变量不起作用