将 Activity 作为 WeakReference 传递以避免内存泄漏
AsyncTask 通常需要引用调用它的 Activity。
如果 AsyncTask 是 Activity 的内部类,那么你可以直接引用它和任何成员变量/方法。
但是,如果 AsyncTask 不是 Activity 的内部类,则需要将 Activity 引用传递给 AsyncTask。执行此操作时,可能出现的一个潜在问题是 AsyncTask 将保留 Activity 的引用,直到 AsyncTask 在其后台线程中完成其工作。如果在 AsyncTask 的后台线程工作完成之前 Activity 已完成或终止,则 AsyncTask 仍将引用 Activity,因此无法进行垃圾回收。
结果,这将导致内存泄漏。
为了防止这种情况发生,请在 AsyncTask 中使用 WeakReference ,而不是直接引用 Activity。
以下是使用 WeakReference 的 AsyncTask 示例:
private class MyAsyncTask extends AsyncTask<String, Void, Void> {
private WeakReference<Activity> mActivity;
public MyAsyncTask(Activity activity) {
mActivity = new WeakReference<Activity>(activity);
}
@Override
protected void onPreExecute() {
final Activity activity = mActivity.get();
if (activity != null) {
....
}
}
@Override
protected Void doInBackground(String... params) {
//Do something
String param1 = params[0];
String param2 = params[1];
return null;
}
@Override
protected void onPostExecute(Void result) {
final Activity activity = mActivity.get();
if (activity != null) {
activity.updateUI();
}
}
}
从 Activity 调用 AsyncTask:
new MyAsyncTask(this).execute("param1", "param2");
从片段调用 AsyncTask:
new MyAsyncTask(getActivity()).execute("param1", "param2");