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

use*_*468 1 android instance-variables instance android-asynctask

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

谢谢!

Jos*_*arl 10

传递一个活动,或者当你必须小心ContextAsyncTask这不是一个内(非静态)类的活动-这是因为在这种情况下,寿命Activity/ ContextAsyncTask是不同的,如果你坚持到Activity/ Context比你应该更长的时间会导致内存泄漏.

而不是保持活动或活动上下文本身,AsyncTask你应该保持 WeakReference活动.这将确保在需要时垃圾收集器(GC)可以回收与Activity关联的内存.

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
    }
}
Run Code Online (Sandbox Code Playgroud)

传递时Context总是尝试尽可能使用ApplicationContext,因为这是最长寿的上下文.