使用Picasso和自定义磁盘缓存

Vek*_*r88 23 android caching picasso

Volley库中,NetworkImageView类需要ImageLoader 通过在ImageCache 实现中搜索所有图像请求来处理所有图像请求,用户可以自由选择缓存应该如何工作,图像的位置和名称.

我正在切换Volley 到Retrofit,我决定尝试的图像Picasso.

使用前一个库,我在包含图像URL的每个项目中都有一个String参数,然后我使用myNetworkImageView.setImageUrl(item.getURL())它,它能够确定图像是否缓存在磁盘上.如果图像存在于缓存文件夹中,则加载图像,否则下载并加载图像.

我希望能够对Picasso做同样的事情,是否可以使用PicassoAPI或我应该自己编写这样的功能?

我想将图像下载到文件夹(缓存文件夹),并Picasso.with(mContext).load(File downloadedimage)在完成时使用.这是正确的方法还是有任何最佳做法?

Jak*_*ton 48

毕加索没有磁盘缓存.它委托您用于该功能的任何HTTP客户端(依赖于缓存控制的HTTP缓存语义).因此,您寻求的行为是免费的.

如果本地缓存中不存在图像(并且该图像未过期),则基础HTTP客户端将仅通过网络下载图像.

也就是说,你可以java.net.HttpUrlConnection(via ResponseCache或OkHttp(via ResponseCacheOkResponseCache)创建自定义缓存实现,它们以你想要的格式存储文件.不过,我强烈建议不要这样做.

让Picasso和HTTP客户端为您完成工作!

你可以调用setIndicatorsEnabled(true)Picasso实例看到正在加载的图像,其中一个指标.它看起来像这样:

如果您从未看到蓝色指示符,则可能是您的远程映像未包含正确的缓存标头以启用缓存到磁盘.

  • @JakeWharton我非常不同意你的观点,认为这是一种非典型的需求.我工作的每个应用程序都要求图像可以离线使用.这意味着如果无法从网络获取图像但是在磁盘缓存中可用,则应提供该图像.无论它多大了. (5认同)
  • @DanieleSegato然后使用唯一的URL并返回令人讨厌的大型缓存标头(1yr +).此外,如果网络检索失败3次,Picasso会使用过时的缓存图像. (2认同)

txu*_*ulu 12

如果您的项目使用okhttp库,那么picasso将自动将其用作默认下载程序,并且磁盘caché将自动运行.

假设您使用Android Studio,只需dependenciesbuild.gradle文件中添加这两行,即可进行设置.(无需额外配置毕加索)

dependencies {
    [...]
    compile 'com.squareup.okhttp:okhttp:2.+'
    compile 'com.squareup.okhttp:okhttp-urlconnection:2.+'
}
Run Code Online (Sandbox Code Playgroud)