非原子缓存



正在阅读这篇关于位图缓存的android官方文章。

我想知道这篇文章中介绍的架构:

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检查缓存是否存在,启动异步任务,然后该任务将图像放入缓存。

我想知道这是否有风险,因为它不是原子的——你有一个组件检查缓存,另一个组件把东西放进缓存。选择会更好吗

  1. 将存在性检查移动到doInBackground;或

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

你们怎么看?

这没有风险,因为事实证明它是原子的。如文档中所述,LruCache是线程安全的。UI线程将始终能够"查看"doInBackground()先前对mMemoryCache所做的任何修改。

addBitmapToMemoryCache()中有一点竞争条件,在第一个后台工作者验证getBitmapFromMemCache()返回null之后,第二个后台工作者可以向mMemoryCache添加位图,但这几乎没有实际后果。

相关内容

  • 没有找到相关文章

最新更新