我有一个包含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();
}
答案 0 :(得分:0)
我真的不明白导致NullPointerException
的原因。
但您可能想要my answer here查看AsyncTask
,它不是活动的内部类,而是static
。启动的内部异步任务只要它们正在运行就会泄漏上下文/活动。对于短期运行的任务而言,这可能没有问题,但如果它长时间停留或执行,则会在此时泄漏内存。
这个可能暗示你问题的答案......