(我的所有图片都存储在本地磁盘上,因此不需要网络功能,所以我认为 Volley 不适用)
2018年9月更新:几年后,我需要一个本地图像缓存解决方案,它与目前需要的功能几乎相同。这一次,UIL已经没有在积极开发了。我比较了一些流行的库,结论非常显然:只需使用Glide。它更强大且可配置性更高。几年前我不得不分叉并对UIL进行更改。Glide支持所有我的用例,包括有关缓存策略和具有自定义键的多个分辨率缓存的所有内容。只需使用Glide!
Koushik Dutta的比较主要是针对速度基准测试的。他的帖子只涉及非常基本的内容,并且不特定于本地图像。我想分享一下我在问问题后使用Picasso和UIL的经验。Picasso和UIL都可以加载本地图像。我首先尝试了Picasso并感到满意,但后来我决定切换到UIL以获得更多的自定义选项。
Picasso:
Picasso的流畅接口很好。但是跳来跳去的“with”、“into”、“load”,你实际上不知道背后发生了什么。返回的结果让人困惑。
Picasso允许您指定精确的目标大小。当您面临内存压力或性能问题时,您可以为速度牺牲一些图像质量。
图像缓存时带有尺寸,这对于显示不同尺寸的图像非常有用。
您可以自定义内存缓存大小。但是它的磁盘缓存仅用于http请求。对于本地图像,如果您关心加载速度,则最好拥有缩略图磁盘缓存,这样您不必每次读取几MB的图像。Picasso没有此机制来调整大小并保存缩略图到磁盘。
Picasso不公开访问其缓存实例。(您可以在第一次配置Picasso时获得它并将其保留下来…)。
有时您想要异步地将图像读入由侦听器返回的位图中。令人惊讶的是,Picasso没有这个功能。“fetch()”不传递任何东西。“get()”用于同步读取,“load()”用于异步绘制视图。
Picasso在主页上只有几个简单的例子,您需要阅读无序的javadoc才能获得高级用法。
UIL:
UIL使用构建器进行自定义。几乎所有内容都可以配置。
UIL不允许您指定要加载到视图中的大小。它使用基于视图大小的一些规则。它不像Picasso那样灵活。我没有办法加载较低分辨率的图像以减少内存占用。(编辑:通过在源代码中添加ImageSize参数并绕过视图大小检查,可以轻松修改此行为)
UIL提供可定制的磁盘缓存,您可以使用此功能来缓存指定大小的缩略图。但它并不完美。这里是详细信息:details。(编辑:如果您关心速度并且想要多个级别的缩略图缓存(例如我的情况),则可以修改源代码,使磁盘缓存使用“memoryKey”,并使其也具有大小敏感性)
UIL默认情况下会将不同大小的图像缓存在内存中,并且可以在配置中关闭。
UIL公开了您可以访问的后备内存和磁盘缓存。
UIL提供了灵活的方式,您可以获取位图或加载到视图中。
UIL在文档方面更好。 UIL在Github页面上提供了详细的用法说明,并提供了链接教程。
如果需要更多的控制和自定义,请从Picasso开始,使用UIL。
如果你在G+上阅读了Koush的this帖子,你将会得到明确的解决方案,我已经总结了其中的内容。Android-Universal-Image-Loader是符合你要求的最佳选择!
Picasso 如果你使用网络,它有最好的图像API!
UrlImageViewHelper + AndroidAsync 是最快的。使用这两个伟大的库真正凸显了图像API已经过时。
Volley 真是太棒了;我真的很喜欢他们可插拔的后端传输,也许最终会将 AndroidAsync 替换为 Volley。请求优先级和取消管理非常好(如果你使用网络)。
Android-Universal-Image-Loader 是目前最流行的。高度可定制。
.fit()
与.centerCrop()
或.centerInside()
相结合,以降低内存使用量并避免在UI线程上调整位图大小。Picasso正在积极开发和支持,这无疑是一个巨大的优势。
Volley没有太大的变化,但我同时注意到两个问题:
出于这些原因,我决定停止使用Volley。
UIL仍然很慢(特别是磁盘缓存),并且其API往往会经常更改。
我还测试了这个新库叫做Glide 3,它声称比Picasso更优化,并提供了类似于Picasso的API。根据我的个人经验,在网络请求下重载时,它实际上比Picasso和Volley更慢,即使与OkHttp一起使用也是如此。更糟糕的是,在离开活动时会导致我的应用程序崩溃。它仍然比竞争对手有2个优点:
结论:我现在推荐使用Picasso + OkHttp,因为它提供了最佳的灵活性、API、性能和稳定性的组合。如果需要GIF支持,您还可以考虑Glide。
ImageLoader
类和配置。您只需要继承ImageLoader
类即可。请参见此处:https://github.com/nostra13/Android-Universal-Image-Loader/issues/92#issuecomment-9915691 - TalkLittlePicasso.context(context).load(url).into(imageview)
,即可更快,更平稳地集成图像。我认为ImageLoader比Picasso库更具可定制性和灵活性。
public void displayImage(String uri, ImageAware imageAware, DisplayImageOptions options, ImageSize targetSize, ImageLoadingListener listener, ImageLoadingProgressListener progressListener)
。 - Martin Mlostek