为了账号安全,请及时绑定邮箱和手机立即绑定

非原子缓存

非原子缓存

www说 2021-12-22 18:57:13
我想知道本文中介绍的架构: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);你们有什么感想?
查看完整描述

1 回答

?
长风秋雁

TA贡献1757条经验 获得超7个赞

这并不冒险,因为事实证明它是原子的。如文档中所述,LruCache是线程安全的。UI 线程将始终能够“看到”mMemoryCachedoInBackground().

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


查看完整回答
反对 回复 2021-12-22
  • 1 回答
  • 0 关注
  • 183 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号