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