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