fresco 两种判断图片是否已经缓存在SD卡上的方法

问题场景

在使用fresco过程中,我们有这么种应用场景:在高清图片未缓存在本地时,显示的是缩略图(要服务器支持),当高清图片已缓存在本地时,显示高清图片。

那么使用fresco如何判断一张图片是否已经缓存在硬盘上了呢?

解决办法

  • 第一种方式:
boolean isCacheInDisk = Fresco.getImagePipelineFactory().getMainDiskStorageCache().hasKey(new SimpleCacheKey(Uri.parse(url)));

参数url是高清图的地址。但是这种方法是在主线程操作的,这样如果你把它放在一个ListView的item中去判断的话,那么列表在滑动的时候会有点卡顿的现象。

  • 第二种方式:
DataSource<Boolean> dataSource = Fresco.getImagePipeline().isInDiskCache(Uri.parse(url));
DataSubscriber<Boolean> subscriber = new BaseDataSubscriber<Boolean>() {
    @Override
    protected void onNewResultImpl(DataSource<Boolean> dataSource) {
        Boolean isCache = dataSource.getResult();
        if (isCache != null && isCache) {
            ThreadPool.getUIHandler().post(new Runnable() {
                @Override
                public void run() {
                    setImageURI(Uri.parse(url));
                }
            });
        }
    }

    @Override
    protected void onFailureImpl(DataSource<Boolean> dataSource) {

    }
};
dataSource.subscribe(subscriber, ThreadPool.getThreadsExecutor());

这个方法是使用数据订阅的方式,这种方式在官网中也有介绍。dataSource.subscribe()这里需要传两个参数,第二个参数是一个Executor,这里我是使用项目中自定义的一个ThreadPoolExecutor。需要注意的是回调方法onNewResultImpl还是在非UI线程里的,这里我们在确定高清图已经缓存时,需要重新设置setImageURI,但是SimpleDraweeView$setImageURI这个方法需要在UI线程里,所以这里使用了一个UIHandler进行UI更新。否则会报如下错误:

java.lang.IllegalStateException
at com.facebook.common.internal.Preconditions.checkState(Preconditions.java:158)
at com.facebook.drawee.components.DeferredReleaser.ensureOnUiThread(DeferredReleaser.java:103)
at com.facebook.drawee.components.DeferredReleaser.cancelDeferredRelease(DeferredReleaser.java:98)
at com.facebook.drawee.controller.AbstractDraweeController.init(AbstractDraweeController.java:121)
at com.facebook.drawee.controller.AbstractDraweeController.initialize(AbstractDraweeController.java:114)
at com.facebook.drawee.backends.pipeline.PipelineDraweeController.initialize(PipelineDraweeController.java:81)
at com.facebook.drawee.backends.pipeline.PipelineDraweeControllerBuilder.obtainController(PipelineDraweeControllerBuilder.java:68)
at com.facebook.drawee.backends.pipeline.PipelineDraweeControllerBuilder.obtainController(PipelineDraweeControllerBuilder.java:33)
at com.facebook.drawee.controller.AbstractDraweeControllerBuilder.buildController(AbstractDraweeControllerBuilder.java:281)
at com.facebook.drawee.controller.AbstractDraweeControllerBuilder.build(AbstractDraweeControllerBuilder.java:265)
at com.facebook.drawee.controller.AbstractDraweeControllerBuilder.build(AbstractDraweeControllerBuilder.java:37)
at com.facebook.drawee.view.SimpleDraweeView.setImageURI(SimpleDraweeView.java:107)
at com.facebook.drawee.view.SimpleDraweeView.setImageURI(SimpleDraweeView.java:97)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值