Android:在AsyncTask中传递字符串参数?

问题描述:

我正在实现一个Android应用程序来加载RSS提要。它工作得很好,直到我决定添加一个新的屏幕来显示两个按钮并尝试将一个String值传递给AsyncTask。想法是这样的:屏幕将显示两个按钮供用户选择。一旦用户点击了其中一个按钮,它将调用AsyncTask以及字符串值(url)来读取RSS(url),然后通过displayRSS(url)显示rss提要。 readRSS(url)将相应地加载RSS提要。Android:在AsyncTask中传递字符串参数?

我的代码如下:

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改变价值延伸的AsyncTask,但它给了我编译错误。所以我改变了受保护的Void doInBackground(String ... url),然后将url传递给readRSS(url),但它也不起作用。我应该如何实现这一目标?

在此先感谢!

+0

这是什么意思“它不工作,要么”? –

+0

@ K-ballo表示它仍然给我编译错误。但我设法通过传递arg0 [0]读取RSS()来使用CaseyB提供的答案修复它。 –

+0

如果我的答案适合您,那么您选择单击旁边的复选标记以接受答案。 – CaseyB

......表示它实际上正在传递该类型的数组。所以,如果你将其更改为:

protected Void doInBackground(String... arg0) 

你需要做的是:

@Override 
protected Void doInBackground(String... arg0) 
{ 
    readRSS(arg0[0]); 
    // should be readRSS(url) here 
    return null; 
} 
+0

感谢您的回答!还有一个问题,我应该如何调用AsyncTask?最初我是这样做的: startLoadRSS(); (){ private void startLoadRSS(){ \t new RSS_Load()。execute(); } 这是否意味着我可以通过startLoadRSS(url)调用它? –

+0

@princess_blackforest:'private void startLoadRSS(String url){new RSS_Load()。execute(url); }'。只是一个提示:为你的'AsyncTask'创建一个显式构造器,它接受你需要执行的所有参数。这样一来,意外地通过错误的变量变得更加困难,或者根本没有。它还避免了必须查看'doInBackground(...)'的实际实现,以便了解它需要的数据。 –

+0

请......将您的'arg0'改为有意义的东西...使用默认参数名称编写代码,或者更糟糕的是,编程使得编程难度加大,甚至更糟糕,可能会导致几次调试过程混乱。 – Phix