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

问题场景

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

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

解决办法

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

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

  • 第二种方式:
DataSource dataSource = Fresco.getImagePipeline().isInDiskCache(Uri.parse(url));
DataSubscriber subscriber = new BaseDataSubscriber() {
    @Override
    protected void onNewResultImpl(DataSource 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 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)

你可能感兴趣的:(Fresco,Android学习笔记)