2012-02-28 86 views
1

我有一個MainActivity和一個AsyncTask MyTask。他們是分開的班級。在MyTask中,我想更新MainActivity中的TextView。如何從公共AsyncTask獲取MainActivity TextView?

這似乎很容易,如果MyTask在MainActivity的內部類中,因爲我可以只調用findViewById()。但是現在這兩個類是分開的。

所以在我的MainActivity我這樣做:

MyTask myTask=new MyTask(); 
Context context=this.getApplicationContext(); 
myTask.execute(context); 

而我的任務是這樣的:

public class MyTask extends AsyncTask<Context, Void, Void> 
{ 
    TextView mText; 
    protected Void doInBackground(Context... params) { 
     Context context=params[0]; 
     mText = (TextView) ((MainActivity)context).findViewById(R.id.text); 
... 
    } 
} 

我知道了「多行文字=(TextView的)((MainActivity)上下文).findViewById (R.id.text);」是錯誤的,但我還沒有找到解決方案。

任何提示

由於提前

+0

有一個ClassCastException當我試圖找到 – 2012-02-28 20:09:03

+0

你得到一個ClassCastException,因爲你傳遞的應用程序環境,而不是TextView的活動。在你的例子中,替換'myTask.execute(context);' 'myTask.execute(this);' – gngr44 2012-02-28 20:16:42

回答

3

你可以做這樣的事情。你可以忽略的WeakReference如果任務不會很長的生活:

public class MyTask extends AsyncTask<Void, Void, Void> { 
    private WeakReference<MainActivity> mActivity; 
    public MyTask(MainActivity activity) { 
    mActivity = new WeakReference<MainActivity>(activity); 
    } 

    public void onPostExecute(Void result) { 
    MainActivity activity = mActivity.get(); 
    if (activity != null) { 
     TextView text = activity.findViewById(R.id.text); 
    } 
    } 
} 
+0

謝謝@ gngr44,那工作:-) – 2012-02-28 20:20:24

+0

我從字面上尋找幾個小時,直到我找到了這個,anwser大ups! – Suprsonic 2013-07-03 20:08:32