WeakReference 的get 方法返回的强引用是否会导致AsyncTask onProgressUpdate 内存泄漏?

Can the strong reference returned from WeakReference's get method cause a memory leak in AsyncTask onProgressUpdate?

我想使用 WeakReference 来避免 AsyncTask 中的内存泄漏。我在网上找的例子只用了onPostExecute中的get()方法,但是我也想用它来更新进度。现在我想知道 get 方法的频繁调用本身是否会导致内存泄漏?

private static class ExampleAsyncTask extends AsyncTask<Integer, Integer, String> {
    private WeakReference<MainActivity> activityReference;

    ExampleAsyncTask(MainActivity context) {
        activityReference = new WeakReference<>(context);
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();

        MainActivity activity = activityReference.get();
        if (activityReference.get() == null) {
            return;
        }

        activity.progressBar.setVisibility(View.VISIBLE);
    }

    @Override
    protected String doInBackground(Integer... integers) {
        Log.i("TAG", "doInBackground started");
        for (int i = 1; i < integers[0]; i++) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            publishProgress((i * 100) / integers[0]);
        }

        return "Finished";
    }

    @Override
    protected void onProgressUpdate(Integer... values) {
        super.onProgressUpdate(values);

        MainActivity activity = activityReference.get();
        if (activity == null || activity.isFinishing()) {
            return;
        }

        activity.progressBar.setProgress(values[0]);
    }

    @Override
    protected void onPostExecute(String s) {
        super.onPostExecute(s);

        MainActivity activity = activityReference.get();
        if (activity == null || activity.isFinishing()) {
            return;
        }

        activity.progressBar.setProgress(0);
        activity.progressBar.setVisibility(View.INVISIBLE);
        Toast.makeText(activity, s, Toast.LENGTH_SHORT).show();
    }
}

getonProgressUpdate 而言,您的代码几乎没有强引用,因为您使用的局部变量将超出范围,此时 onProgressUpdate 是完成。

所以基本上每次您的代码访问引用时,都会从 get() 方法中检索,因此它是安全的。虽然这会是一个问题,但如果您保留一个引用,在 onProgressUpdate 方法

之外声明