非原子缓存


我想知道本文中介绍的架构:


public void loadBitmap(int resId, ImageView imageView) {

    final String imageKey = String.valueOf(resId);


    final Bitmap bitmap = getBitmapFromMemCache(imageKey);

    if (bitmap != null) {

        mImageView.setImageBitmap(bitmap);

    } else {

        mImageView.setImageResource(R.drawable.image_placeholder);

        BitmapWorkerTask task = new BitmapWorkerTask(mImageView);

        task.execute(resId);

    }

}


class BitmapWorkerTask extends AsyncTask<Integer, Void, Bitmap> {

    ...

    // Decode image in background.

    @Override

    protected Bitmap doInBackground(Integer... params) {

        final Bitmap bitmap = decodeSampledBitmapFromResource(

                getResources(), params[0], 100, 100));

        addBitmapToMemoryCache(String.valueOf(params[0]), bitmap);

        return bitmap;

    }

    ...

}

loadBitmap 检查缓存是否存在,分出一个异步任务,然后该任务将图像放入缓存中。


我想知道这是否有风险,因为它不是原子的 - 您有一个组件检查缓存,另一个组件将内容放入缓存。是不是更好


将存在检查移至 doInBackground;或者


创建其他方式,整个交互将是: Bitmap bitmap = getFromCacheOrDecode(key);


你们有什么感想?


www说
浏览 193回答 1
1回答

长风秋雁

这并不冒险,因为事实证明它是原子的。如文档中所述,LruCache是线程安全的。UI 线程将始终能够“看到”mMemoryCache由doInBackground().在 中有一点竞争条件addBitmapToMemoryCache(),在mMemoryCache第一个后台工作人员验证getBitmapFromMemCache()返回后,第二个后台工作人员可以添加位图null,但这几乎没有实际后果。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java