2012-02-28 85 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