问题场景
在使用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)