我正在使用Fresco库。
我在 Fresco 文档中找不到任何相关信息,如何从 Fresco 的磁盘缓存中获取图像文件?
如果图像已在缓存中下载,您可以这样做:
ImageRequest imageRequest=ImageRequest.fromUri(url);
CacheKey cacheKey=DefaultCacheKeyFactory.getInstance()
.getEncodedCacheKey(imageRequest);
BinaryResource resource = ImagePipelineFactory.getInstance()
.getMainDiskStorageCache().getResource(cacheKey);
File file=((FileBinaryResource)resource).getFile();
我希望这有帮助
在此链接上检查 Plamenkos 的答案.. https://github.com/facebook/fresco/issues/80
如果您向管道询问编码图像,并使用 ImageRequestBuilder.setLowestPermittedRequestLevel 指定 DISK_CACHE,则如果在磁盘缓存的任何位置找到图像,管道将返回 JPEG 字节,如果未找到图像并且完整提取将返回 null必须执行。
我希望我没有误解您的问题并提供错误的答案。
ImageRequest request = ImageRequestBuilder.newBuilderWithSource(Uri.parse(YourImageUrl))
.setLowestPermittedRequestLevel(ImageRequest.RequestLevel.DISK_CACHE)
.setResizeOptions(new ResizeOptions(width, width))
.build();
DraweeController controller = Fresco.newDraweeControllerBuilder()
.setOldController(YourImageView.getController())
.setImageRequest(request)
.build();
这段代码:
.setLowestPermittedRequestLevel(ImageRequest.RequestLevel.DISK_CACHE)
将使 fresco 先从磁盘获取图像,然后再从网络获取图像。
我认为您永远不应该尝试获取 Fresco Cache 名称,因为缓存是内部实现。
但是如果你想知道一个图像是否已经被缓存,你可以使用这个:
private boolean isDownloaded(Uri loadUri) {
if (loadUri == null) {
return false;
}
ImageRequest imageRequest = ImageRequest.fromUri(loadUri);
CacheKey cacheKey = DefaultCacheKeyFactory.getInstance()
.getEncodedCacheKey(imageRequest);
return ImagePipelineFactory.getInstance()
.getMainDiskStorageCache().hasKey(cacheKey);
}
此方法返回速度非常快,您可以在 UI 线程中使用它。
private fun getGitFile(gifUrl: String): File {
val request = ImageRequestBuilder.newBuilderWithSource(Uri.parse(gifUrl))
.setLowestPermittedRequestLevel(ImageRequest.RequestLevel.DISK_CACHE)
.build()
val cacheKey = DefaultCacheKeyFactory.getInstance()
.getEncodedCacheKey(request, null)
val resource = ImagePipelineFactory.getInstance()
.mainFileCache.getResource(cacheKey)
val file = (resource as FileBinaryResource).file
return file
}