2012-05-22 2 views
0

RSS 피드를로드하기 위해 Android 앱을 구현하고 있습니다. 두 개의 버튼을 표시하고 AsyncTask에 String 값을 전달하려고 새 화면을 추가하기 전까지는 완벽하게 작동합니다. 아이디어는 다음과 같습니다. 사용자가 선택할 수있는 두 개의 버튼이 화면에 표시됩니다. 사용자가 버튼 중 하나를 클릭하면 문자열 값 (url)에서 readRSS (url)와 함께 AsyncTask를 호출 한 다음 rss 피드가 displayRSS (url)에 의해 표시됩니다. readRSS (url)는 이에 따라 RSS 피드를로드합니다. 내가 RSS_Load의 값을 변경하기 위해 노력하고있어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(); 

      }    

} 
} 

AsyncTask를 확장하지만 나에게 오류를 컴파일 제공 :

내 코드는 다음과 같습니다. 그래서 보호 된 Void doInBackground (String ... url)를 변경 한 다음 url을 readRSS (url)로 전달했지만 작동하지 않습니다. 어떻게해야합니까?

미리 감사드립니다.

+0

는 "그 중 하나가 작동하지 않습니다"란 무엇을 의미 하는가? –

+0

@ K-ballo는 여전히 컴파일 오류가 있음을 의미합니다. 하지만 arg0 [0]을 readRSS()에 전달하여 CaseyB가 제공 한 답을 사용하여 문제를 해결했습니다. –

+0

내 대답이 효과가 있다면 그 옆에있는 체크 표시를 클릭하여 대답을 수락하십시오. – CaseyB

답변

4

... 실제로 해당 유형의 배열을 전달한다는 것을 의미합니다. 당신이 그것을 변경 그래서 경우 :

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 새 RSS_Load(). execute(); } startLoadRSS (url)로 호출 할 수 있습니까? –

+0

@princess_blackforest :'private void startLoadRSS (String url) {새로운 RSS_Load(). execute (url); }'. 단지 팁 : 실행에 필요한 모든 매개 변수를 취하는 AsyncTask를위한 명시 적 생성자를 생성하십시오. 그렇게하면 실수로 잘못된 변수를 전달하는 것이 더 어려워 지거나 전혀 변하지 않게됩니다. 또한 필요한 데이터를 이해하기 위해'doInBackground (...)'의 실제 구현을 살펴 보는 것을 피합니다. –

+0

제발 ... 'arg0'을 의미있는 것으로 변경하십시오 ... 기본 인수 이름으로 코드를 작성하거나 나쁜 코드를 작성하는 것은 프로그래밍을 어렵게 만들고 악화 시키며 디버깅 프로세스를 혼란스럽게 할 수 있습니다. – Phix

관련 문제