2016-07-22 96 views
1

我想在textView中發佈我的AsyncTask(一個字符串)的結果。在AsyncTask中獲取TextView - Android

這裏是我公司主營:

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    ReadRss readRss=new ReadRss(this); 
    readRss.execute(); 
    ...... 
} 

這裏是我的AsyncTask:

public class ReadRss extends AsyncTask<Void,Void,Void> { 

public ReadRss(Context context){ 
} 

@Override 
protected void onPreExecute() { 
} 

@Override 
protected void onPostExecute(Void aVoid) { 
} 

@Override 
protected Void doInBackground(Void... params) { 
    ProcessXml(); 
    return null; 
} 

private void ProcessXml() { 
    //HERE CREATE MY STRING 
    String myresult="example"; 

    TextView txt_ris = (TextView)findViewById(R.id.txt_ris); <---HOW CAN I DO THIS? 
    txt_ris.setText(myresult); 

      } 

     } 
    } 
} 

FindViewById不要在工作的AsyncTask這樣?我怎樣才能TextView的在這裏? 也許我可以在AsyncTask中將它作爲paramiter傳遞,語法是什麼?

+0

移動代碼編輯postExecute – W0rmH0le

+1

內的文本視圖不能更改從後臺線程的UI無論如何,即使你傳遞的TextView作爲擴聲rameter。您可以使用[EventBus](https://github.com/greenrobot/EventBus)在獲取數據時發佈事件,在您的活動中監聽該事件,並在該事件中更改文本。 – Vucko

+0

我不能將字符串返回到主?你可以做一個EventBus的例子嗎?在主線程上調用onPreExecute()和onPostExecute()方法調用 – GMX

回答

2

您需要將UI工作onPostExecute方法,因爲doInBackground執行不UI線程

public class ReadRss extends AsyncTask<Void,Void,String> { 

    public ReadRss(Context context){ 
    } 

    @Override 
    protected void onPreExecute() { 
    } 

    @Override 
    protected void onPostExecute(String string) { 
     TextView txt_ris = (TextView)findViewById(R.id.txt_ris); 
     txt_ris.setText(myresult); 
    } 

    @Override 
    protected String doInBackground(Void... params) { 
     return ProcessXml(); 
    } 

    private String ProcessXml() { 
     //HERE CREATE MY STRING 
     return "example"; 
    } 
} 
+0

protected String doInBackground(Void ... params){ return ProcessXml(); }這裏我得到一個錯誤:doInBackground(Void ...)與doInBackground(Params)發生衝突...嘗試使用不兼容的類型。 – GMX

+0

因爲我將字符串從ProcessXml()傳遞給onPostExecute,所以不要使用錯誤。我得到錯誤使用返回並試圖修改無效方法 – GMX

+0

提供'processXml()'和完整的堆棧跟蹤的完整代碼,請 –

1

爲了您的TextView被正確引用,你需要一個框架,並且你已經在你的起始活動參考您的AsyncTask的構造函數,所以你可以這樣做:

public class ReadRss extends AsyncTask<Void,Void,Void> { 

    private TextView tv; 
    private YourStartingActivity activity; 

    public ReadRss(Context context){ 
     activity = (YourStartingActivity)context; 
     tv = (TextView)activity.findViewById(R.id.txt_ris) 
    } 

    @Override 
    protected void onPreExecute() { 
     ... 
    } 

    @Override 
    protected void onPostExecute(Void aVoid) { 
     (follow Michael Spitsin instructions here) 
    } 

    @Override 
    protected Void doInBackground(Void... params) { 
     ... 
    } 
} 
+0

您的回答看起來不錯,但我現在不知道如何將字符串從ProcessXml()傳遞給onPostExecute。我在某些方法(邁克爾Spitsin解決方案)中使用返回時出現錯誤,請問您是否可以更正返回和無效方法來執行此操作? – GMX

+0

我只是在AsyncTask的頂部定義了我的字符串,並在inPostExecute()中設置了TextView的值;然後再實現你的答案。這3個修改工作正常。非常感謝 – GMX

+0

請考慮upvoting我的答案:)抱歉,以前沒有回覆,我很忙。 – Chisko