將 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");