代码之家  ›  专栏  ›  技术社区  ›  Florian Walther

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

  •  2
  • Florian Walther  · 技术社区  · 6 年前

    我想使用 WeakReference 避免内存泄漏 AsyncTask 。我在网上找到的示例仅使用 get() 中的方法 onPostExecute ,但我也想用它来更新进度。现在我想知道 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();
        }
    }
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   Pavneet_Singh    6 年前

    您的代码几乎没有关于 get onProgressUpdate 因为您使用的局部变量将超出范围 onProgressUpdate 已完成。

    因此,基本上每次代码访问引用时 get() 方法,使其安全。虽然这会是一个问题,但如果你保留一个参考,在外面声明 onProgressUpdate 方法