从AsyncTask中的活动访问实例变量

时间:2011-05-16 23:40:31

标签: android instance android-asynctask instance-variables

我有一个AsyncTask(在一个单独的文件中),它被调用 活动。当我实例化AsyncTask时,我将活动发送为 PARAM。如何从中访问acitivity的实例变量 AsyncTask的onPostExecute方法?

谢谢!

3 个答案:

答案 0 :(得分:10)

将Activity或Context传递给不属于Activity的内部(非静态)类的AsyncTask时必须小心 - 这是因为在这种情况下{的生命周期{1}} / ActivityContext不同,如果您坚持AsyncTask / Activity的时间超过您的预期,则会导致内存泄漏。< / p>

您应该在活动中保留Context,而不是在AsyncTask中保留活动或活动上下文。这将确保在需要时垃圾收集器(GC)可以回收与Activity关联的内存。

WeakReference

传递public class MyTask extends AsyncTask<..., ..., ...> { private WeakReference<MyActivity> mParentActivity = null; public MyTask(MyActivity parentActivity) { mParentActivity = new WeakReference<MyActivity>(parentActivity); } @Override public ... doInBackground(... params) { // do some stuff // now we do something that requires the context if (mParentActivity.get() != null) { // the WeakReference is still valid and hasn't been reclaimed // by the GC final MyActivity parentActivity = mParentActivity.get(); parentActivity.doSomething(); } // return result } } 时,请尽可能使用Context,因为这是最长寿的背景。

答案 1 :(得分:1)

与程序员Bruce的答案类似,但不是通过AsyncTask本身将Activity作为Param传递,只需添加一个构造函数来获取父Activity。我自己的代码示例......

public class FileDownloader extends AsyncTask<..., ..., ...> {
    private MyActivity parentActivity = null;

    public FileDownloader(MyActivity parentActivity) {
        this.parentActivity = parentActivity;
    }
}

在您的活动中创建它时,请执行此操作...

FileDownloader fdl = new FileDownloader(this);
fdl.execute(...);

编辑:在回复您的评论时,请确保将mLogin声明为public,然后使用...

parentActivity.mLogin

如果不起作用,请尝试...

((MyActivity)parentActivity).mLogin

答案 2 :(得分:0)

您可以从AsyncTask<Object, x x>扩展,然后您可以传入任意数量的任意参数,无需传递对整个Activity的引用。

 new CustomTask().execute(param1, param2, param3);

您可以在doInBackground中引用:

 public Void doInBackground(Object... params) {
    Integer id = (Integer) params[0];
    String name = (String) params[1];
    ....
 }