【发布时间】:2017-09-18 07:23:43
【问题描述】:
我在这里阅读了一些问题,在 Internet 上阅读了一些文章,但是关于 AsyncTask 中的内存泄漏的问题对我来说并不清楚。请问,你能给我建议吗?
让我们考虑一些情况:
1) AsyncTask 是一个内部类
我编写 MyAsyncTask 以在 MyActivity 代码(不是静态类)中从服务器(
我决定做什么:由于要下载的数据的大小,我将在 MyActivity 的 onDestroy() 方法中取消我的 AsyncTask。这样,我就有了这样的MyActivity代码:
public class MyActivity extends Activity {
//views and constants
private MyAsyncTask air;
private ProgressDialog progressDialog;
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.account_info_layout);
progressDialog = new ProgressDialog(this);
//findViewById, etc.
}
@Override
protected void onStart() {
super.onStart();
air = new MyAsyncTask();
air.execute();
}
@Override
protected void onDestroy() {
if (air.getStatus() == AsyncTask.Status.RUNNING) {
air.cancel(true);
}
air = null;
super.onDestroy();
}
class MyAsyncTask extends AsyncTask<Void, Void, String> {
@Override
protected void onPreExecute() {
super.onPreExecute();
UserData.refreshTimer();
if (!progressDialog.isShowing())
progressDialog.show();
}
@Override
protected String doInBackground(Void... params) {
//GET request
return result;
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
//handle results
progressDialog.dismiss();
}
}
}
因此,如果我的活动实例被销毁,我将取消我的异步任务,并在 onStart() 中创建新实例。它会产生内存泄漏,还是会因为 progressDialog 实例而产生 IllegalArgumentException/NullPointerException?我想,它不会产生任何异常,因为如果我取消 AsyncTask,onPostExecute() 将不会被调用。
2) AsyncTask 在自己的文件中
下一种情况是我在其他文件中编写 MyAsyncTask 并传入构造函数 Context 实例。如果我将 Context 存储为 WeakReference,这种方法会产生内存泄漏吗?在调用 Activity 时取消 onDestroy() 方法中的 AsyncTask 以避免在 onPostExecute() 方法期间出现 IllegalArgumentException/NullPointerException 是否正确?或者,避免这些异常的其他方法是检查我的 Context 变量是否为 null。
其他方法:我听说过 Otto 库,关于使用保留片段,但现在我想要了解这些问题。如果有人知道 - 请回答。
【问题讨论】:
标签: android memory-leaks android-asynctask