我正在寻找Android中的异步图像加载和缓存库。我打算使用Picasso,但我发现Universal Image Loader在GitHub上更受欢迎。有谁知道这两个图书馆?优点和缺点的摘要会很棒。
(我的所有图片都在本地磁盘上,因此我不需要联网,因此我认为Volley不合适)
答案 0 :(得分:80)
2018年9月更新:几年后,我对本地图像缓存解决方案需要几乎相同的东西。这一次,UIL尚未积极开发。我比较了流行的库,结论很简单:只需使用Glide。它功能强大且可配置。多年前我不得不分叉并对UIL进行更改。 Glide支持我的所有用例,包括缓存策略和使用自定义键的多级分辨率缓存。只需使用Glide!
Koushik Dutta的比较主要是速度基准。他的帖子只触及了非常基本的东西,并不是特定于本地图像。在我提出问题之后,我想与毕加索和UIL分享我的经历。 Picasso和UIL都可以加载本地图像。我第一次尝试Picasso并且很高兴,但后来我决定切换到UIL以获得更多自定义选项。
<强>毕加索:强>
Picasso流畅的界面很不错。但是,随着“with”,“into”,“load”的跳跃,你实际上并不知道幕后背后是什么。这让人感到困惑。
Picasso允许您指定确切的目标尺寸。当你遇到内存压力或性能问题时,它很有用,你可以牺牲一些图像质量来提高速度。
图像在其键中缓存大小,当您显示不同大小的图像时,它非常有用。
您可以自定义内存缓存大小。但它的光盘缓存仅适用于http请求。对于本地图像,如果您关心加载速度,最好有一个缩略图磁盘缓存,这样您就不必每次都为图像读取几个MB。 Picasso没有这种机制调整大小并在屏幕上保存缩略图。
Picasso不会公开对其缓存实例的访问权限。 (当你第一次配置Picasso并保持它时,你可以抓住它......)。
有时您希望将图像异步读取到侦听器返回的位图中。令人惊讶的毕加索没有那个。 “fetch()”不会传回任何东西。 “get()”用于同步读取,“load()”用于异步绘制视图。
Picasso在主页上只有几个简单的例子,你必须阅读无序的javadoc以获得高级用法。
<强> UIL:强>
UIL使用构建器进行自定义。几乎所有东西都可以配置。
UIL不允许您指定要加载到视图中的大小。它使用一些基于视图大小的规则。它没有毕加索那么灵活。我无法加载较低分辨率的图像以减少内存占用。 (编辑:可以通过在源代码中添加ImageSize参数并绕过视图大小检查来轻松修改此行为)
UIL提供可自定义的光盘缓存,您可以使用它来缓存指定大小的缩略图。但它并不完美。这是details。 (编辑:如果你关心速度并想要多级缩略图缓存,就像我的情况一样,你可以修改源代码,让磁盘缓存使用“memoryKey”,并使它的大小也敏感)
默认情况下,UIL会在内存中缓存不同大小的图像,并且可以在配置中将其关闭。
UIL公开您可以访问的后备内存和磁盘缓存。
UIL提供了灵活的方法来获取位图或加载到视图。
UIL在文档方面更胜一筹。 UIL在Github页面上给出了详细的用法,并且有一个链接的教程。
我建议从Picasso开始,如果你需要更多的控制和定制,那就选择UIL。
答案 1 :(得分:72)
如果您通过Koush阅读G +上的this帖子,您将获得明确的解决方案,我已经提出了相关摘要,因为Android-Universal-Image-Loader是您的要求的赢家!
Picasso 拥有最好的图片API!
UrlImageViewHelper + AndroidAsync 是最快的。玩这些 其他两个很棒的库真的突出了图像API 但是,已经过时了。
Volley 是光滑的;我非常喜欢他们的可插拔后端传输,
并可能最终放弃AndroidAsync。请求优先权
和取消管理很棒(如果你使用网络)
Android-Universal-Image-Loader 是最受欢迎的人之一 目前。高度可定制。
该项目旨在为异步提供可重复使用的仪器 图像加载,缓存和显示。它最初基于Fedor Vlasov的项目自那以后经过了大量的重构和改进 然后
新UIL版本(1.9.2)即将发生的变化:
可以从UI threadNew Disk Cache API调用ImageLoader (更灵活)。基于Jake Wharton的新LruDiscCache DiskLruCache。
考虑所有这些Android-Universal-Image-Loader套件您的要求(将图像加载到本地磁盘上)!
答案 2 :(得分:45)
我想与这三个图书馆分享我的经验:UIL,Picasso和Volley。我之前使用的是UIL,但后来我得出结论我不能真正推荐它,我建议使用Volley或Picasso,这些都是由才华横溢的团队开发的。 UIL一点都不差,但它缺乏对其他两个库的细节的关注。
我发现UIL对UI性能的影响不大;它倾向于比Volley或Picasso更多地锁定UI线程。这可能部分是由于UIL不支持批量处理图像响应而Picasso和Volley默认这样做。
另外,我不喜欢UIL的磁盘缓存系统。虽然您可以在各种实现之间进行选择,但我需要指出的是,目前无法通过总大小和实体到期时间来限制UIL磁盘缓存两者。 Volley和Picasso这样做,他们默认使用服务器返回的到期时间,而UIL忽略它。
最后,UIL允许您设置全局图像加载器配置,其中包括选定的磁盘缓存和内存缓存实现和设置以及其他详细信息,但此配置将应用于应用程序的任何位置。因此,如果你需要更多的灵活性,比如两个独立的磁盘缓存,那么对于UIL来说是不行的。另一方面,Volley允许您拥有任意数量的单独图像加载器,每个图像加载器都有自己的配置。 Picasso默认使用全局实例,但也允许您构建单独的可配置实例。
总结一下:Picasso拥有最好的API,但它使用在所有HttpURLConnection
个实例之间共享的全局HTTP磁盘缓存,在某些情况下这可能过于严格。 Volley具有最佳性能和模块性,但用户友好性较低,需要您自己编写一个或两个模块才能使其按您的需要工作。总的来说,我会推荐他们两个对抗UIL。
编辑(2014年12月18日):自从我写完这个初步答案后情况发生了变化,我认为有必要对其进行改进:
Picasso 2.4比旧版本更具可配置性,当与OkHttp(强烈推荐)一起使用时,它也可以为每个实例使用单独的磁盘缓存,因此您可以做的事情没有任何限制。
更重要的是,我注意到 Picasso和OkHttp的性能提升了很多,在我看来,它现在是Android时代最快的图像加载器解决方案。请注意,在我的代码中,我始终将.fit()
与.centerCrop()
或.centerInside()
结合使用以降低内存使用量,并避免在UI线程上调整位图大小。毕加索积极开发和支持,这当然是一个很大的优势。
由于这些原因,我决定停止使用Volley。
UIL仍然很慢(尤其是磁盘缓存),其API经常会发生变化。
我还测试了这个名为Glide 3的新库,声称比Picasso更加优化了Picasso类API。根据我的个人经验,即使与OkHttp结合使用,在重载下的网络请求期间它实际上比Picasso和Volley慢。更糟糕的是,在离开活动时,它在Lollipop下的应用程序引起了一些崩溃。它仍然比竞争对手有两个优势:
结论:我现在建议使用Picasso + OkHttp,因为它提供了最佳的灵活性,API,性能和稳定性。如果您需要GIF支持,您也可以考虑Glide。
答案 3 :(得分:7)
我已经实现了一个应该不断获取并显示来自互联网的图像的应用。我正准备编写一个图像缓存机制,之前朋友推荐我使用通用图像加载器。
UIL非常好定制。它是如此可定制,以至于新手很容易出错。但是,UIL在我的应用程序中很慢,而且变得有点慢。我的用例是带有图像的ListView。
昨天我正在寻找UIL的替代品,我发现了毕加索。 Picasso易于集成和使用:只需Picasso.context(context).load(url).into(imageview)
,图像可以更快,更顺畅地集成。
对我来说,毕加索绝对是使用的API。我对UIL的经历并不好。
答案 4 :(得分:0)
我认为与毕加索图书馆相比,ImageLoader更具可定制性和灵活性。