暂停的Activity实例上的对象范围和主动清理

时间:2011-09-27 13:17:49

标签: java android android-activity garbage-collection android-asynctask

我有一个包含AsyncTask作为内部类的Activity(正如我在大多数示例中看到的那样)。如果我触发AsyncTask然后通过导航来暂停Activity,则AsyncTask继续执行。据我了解,这是正常和预期的行为。

Activity中有一个成员变量,正由AsyncTask的方法调用访问。我刚刚得到一个NullPointerException而AsyncTask在后台执行时它的Activity被暂停,在我看来,当Activity暂停时它被GC收集了。在我看来,该对象不应被视为超出范围。 Activity中仍然存在代码,为什么Activity的成员变量已经开始被清理了?

通过作为活动内部类的AsyncTasks访问的Activity成员变量的推荐用法是什么?

以下是我的对象具有的关系类型的示例

public class MyActivity {

    MyCustomService myCustomService;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.some_layout);

        myCustomService = ServiceLocator.getInstance(MyCustomService.class);
    }

private class FetchDataTask extends AsyncTask<Void, Void, String> {

    @Override
    protected String doInBackground(Void... arg0) {     

        String data = someOtherService.fetchSomeData(); 
        return data;
    }

    @Override
    protected void onPostExecute(String result) {

        refreshControls(result);
    }       
}

private void refreshControls(String result) {   
    // this is where the object is null after aggressive cleanup
    myCustomService.someMethod();   
}

1 个答案:

答案 0 :(得分:0)

我真的不明白导致NullPointerException的原因。

但您可能想要my answer here查看AsyncTask,它不是活动的内部类,而是static。启动的内部异步任务只要它们正在运行就会泄漏上下文/活动。对于短期运行的任务而言,这可能没有问题,但如果它长时间停留或执行,则会在此时泄漏内存。

这个可能暗示你问题的答案......