异步任务中的弱引用

时间:2014-03-20 17:31:47

标签: java android android-asynctask

我在http://developer.android.com/training/displaying-bitmaps/process-bitmap.html上浏览了这个资源,讨论了如何异步采样图像并将其加载到图像视图中。

我的眼睛抓住了以下代码

protected void onPostExecute(Bitmap bitmap) {
    if (imageViewReference != null && bitmap != null) {
        final ImageView imageView = imageViewReference.get();
        if (imageView != null) {
            imageView.setImageBitmap(bitmap);
        }
    }
}

这个asynctask的构造函数是

  public BitmapWorkerTask(ImageView imageView) {
    // Use a WeakReference to ensure the ImageView can be garbage collected
    imageViewReference = new WeakReference<ImageView>(imageView);
}

我无法理解为什么onPostExecute

中存在此检查
 if (imageViewReference != null && bitmap != null) 

我们刚刚在构造函数中初始化了弱引用。为什么我们必须对它进行可空性检查。 ?

这是100%准确

if (imageView != null)

我们永远不知道imageview是否被垃圾收集,但是有没有条件导致WeakReference类ITSELF被垃圾收集?

1 个答案:

答案 0 :(得分:2)

一般来说,我会说不,这不可能发生,所以它看起来似乎是多余的,但是再一次检查并没有真正损害性能,并且可以防止一些奇怪的崩溃。

我个人总是将我的WeakReferences声明为最终确定。