Android:在AsyncTask中传递字符串参数?
我正在实现一个Android应用程序来加载RSS提要。它工作得非常好,直到我决定添加一个新屏幕来显示两个按钮并尝试将字符串值传递给AsyncTask。其想法是:屏幕将显示两个按钮供用户选择。一旦用户单击其中一个按钮,它将调用AsyncTask以及readRSS(url)的字符串值(url),然后通过displayRSS(url)显示rss提要。readRSS(url)将相应地加载RSS提要 我的代码如下:Android:在AsyncTask中传递字符串参数?,android,rss,android-asynctask,Android,Rss,Android Asynctask,我正在实现一个Android应用程序来加载RSS提要。它工作得非常好,直到我决定添加一个新屏幕来显示两个按钮并尝试将字符串值传递给AsyncTask。其想法是:屏幕将显示两个按钮供用户选择。一旦用户单击其中一个按钮,它将调用AsyncTask以及readRSS(url)的字符串值(url),然后通过displayRSS(url)显示rss提要。readRSS(url)将相应地加载RSS提要 我的代码如下: import java.util.List; import android.app.Act
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();
}
}
}
import java.util.List;
导入android.app.Activity;
导入android.os.AsyncTask;
导入android.os.Bundle;
导入android.widget.TextView;
导入android.widget.Toast;
公共类RSSProActivity扩展活动{
/**在首次创建活动时调用*/
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.rss);
rss();
}
private void和rss(){
新RSS_Load().execute();
}
//
私有void preReadRSS()
{
Toast.makeText(这是“正在阅读RSS,请稍候)”,Toast.LENGTH_LONG.show();
}
私有StringBuffer readRSS(字符串url)
{
//根据输入,将相应地设置字符串值。它应该是“url”,但目前使用默认值。
字符串urlStr=”http://www.bom.gov.au/fwo/IDZ00059.warnings_vic.xml";
AndroidSAXFeedParser saxFeedParser=新的AndroidSAXFeedParser(urlStr);
List parse=saxFeedParser.parse();
StringBuffer sb=新的StringBuffer();
sb.append(parse.size()+“找到的项”);
for(RSSItem项:解析){
sb.append(item.getTitle()+”发布在“+item.getDate());
sb.append(item.getDescription());
}
归还某人;
}
私有void displayRSS()
{
StringBuffer sb=readRSS(url);
TextView TextView=新的TextView(此);
setText(sb.toString());
setContentView(文本视图);
Toast.makeText(这是“成功”,Toast.LENGTH_LONG).show();
}
//异步任务
公共类RSS_加载扩展异步任务{
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
preReadRSS();
}
@凌驾
受保护的Void doInBackground(Void…arg0){
readRSS();
//这里应该是readRSS(url)
返回null;
}
@凌驾
受保护的void onProgressUpdate(void…值){
//super.onProgressUpdate(值);
//updateProgressBar(值[0]);
}
@凌驾
受保护的void onPostExecute(void结果){
super.onPostExecute(结果);
//dismissProgressBar();
//应在此处显示RSS(url)
displayRSS();
}
}
}
我试图更改RSS_Load extends AsyncTask中的值,但它给了我编译错误。因此,我更改了受保护的Void doInBackground(String…url),然后将该url传递给readRSS(url),但它也不起作用。我应该如何做到这一点
提前谢谢 。。。意味着它实际上正在传递一个该类型的数组。因此,如果将其更改为:
protected Void doInBackground(String... arg0)
您需要执行以下操作:
@Override
protected Void doInBackground(String... arg0)
{
readRSS(arg0[0]);
// should be readRSS(url) here
return null;
}
这个。。。意味着它实际上正在传递一个该类型的数组。因此,如果将其更改为:
protected Void doInBackground(String... arg0)
您需要执行以下操作:
@Override
protected Void doInBackground(String... arg0)
{
readRSS(arg0[0]);
// should be readRSS(url) here
return null;
}
“它也不工作”是什么意思?@K-ballo表示它仍然给我编译错误。但是我通过将arg0[0]传递给readRSS(),使用CaseyB提供的答案成功地修复了它。如果我的答案对您有效,那么您选择单击它旁边的复选标记来接受答案。这意味着什么“它也不起作用”@K-ballo意味着它仍然给我编译错误。但是我通过将arg0[0]传递给readRSS(),使用CaseyB提供的答案成功地修复了它。如果我的答案对您有效,那么您选择单击它旁边的复选标记接受答案。谢谢您的回答!还有一个问题,我应该如何调用AsyncTask?最初我是这样做的:startLoadRSS();private void startLoadRSS(){new RSS_Load().execute();}这是否意味着我可以通过startLoadRSS(url)调用它?@princess_blackforest:
private void startLoadRSS(字符串url){new RSS_Load().execute(url);}
。提示:为AsyncTask
创建一个显式构造函数,它接受执行所需的所有参数。这样一来,意外地传入错误的变量或根本不传入变量就变得更加困难了。它还避免了为了了解它需要什么样的数据而查看doInBackground(…)
的实际实现。。。将您的arg0
更改为有意义的内容。。。使用默认参数名编码,或者更糟糕的是,使用不好的参数名编码,会使编程变得困难,更糟糕的是,几次之后可能会使调试过程变得混乱。@Phix同意,我只是让它保持这种方式,以便尽可能少地更改选项对不起,不是直接针对您的:-)谢谢您的回答!还有一个问题,我应该如何调用AsyncTask?最初我是这样做的:startLoadRSS();private void startLoadRSS(){new RSS_Load().execute();}这是否意味着我可以通过startLoadRSS(url)调用它?@princess_blackforest:private void startLoadRSS(字符串url){new RSS_Load().execute(url);}
。提示:为AsyncTask
创建一个显式构造函数,它接受执行所需的所有参数。这样一来,意外地传入错误的变量或根本不传入变量就变得更加困难了。它还避免了为了获得更高的性能而必须查看doInBackground(…)
的实际实现