我正在寻找Android中的异步图像加载和缓存库。我打算使用Picasso,但我发现Universal Image Loader在GitHub上更受欢迎。有谁知道这两个图书馆?优点和缺点的摘要会很棒。
(我的所有图像都在本地磁盘上,因此我不需要联网,因此我认为Volley不合适)
更新于2018年9月:几年后,我需要与本地图像缓存解决方案几乎相同的东西。这一次,UIL尚未积极开发。我比较了流行的库,结论很简单:只需使用Glide。它功能强大且可配置。多年前我不得不分叉并对UIL进行更改。 Glide支持我的所有用例,包括缓存策略和使用自定义键的多级分辨率缓存。只需使用Glide!
Koushik Dutta的比较主要是速度基准。他的帖子只触及了非常基本的东西,并不是特定于本地图像。在我提出问题之后,我想与毕加索和UIL分享我的经历。 Picasso和UIL都可以加载本地图像。我第一次尝试Picasso并且很开心,但后来我决定切换到UIL以获得更多自定义选项。
毕加索:
UIL:
我建议从Picasso开始,如果你需要更多的控制和定制,请选择UIL。
如果您阅读Koush在G +上阅读this帖子,您将获得明确的解决方案,我已经总结了这一点,因为Android-Universal-Image-Loader是您的要求的赢家!
该项目旨在为异步图像加载,缓存和显示提供可重用的工具。它最初基于Fedor Vlasov的项目,并且从那时起经过了大量的重构和改进。
新UIL版本(1.9.2)即将发生的变化:
可以从UI threadNew Disk Cache API调用ImageLoader(更灵活)。基于Jake Wharton的DiskLruCache的新LruDiscCache。
考虑所有这些Android-Universal-Image-Loader套件您的要求(将图像加载到本地磁盘上)!
我想与这三个图书馆分享我的经验: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的变化并没有那么多,但我同时注意到它有两个问题:
出于这些原因,我决定停止使用Volley。
UIL仍然很慢(尤其是磁盘缓存),其API经常会发生变化。
我还测试了这个名为Glide 3的新库,它声称比Picasso更加优化了Picasso-like API。根据我的个人经验,即使与OkHttp结合使用,在重载下的网络请求期间它实际上比Picasso和Volley慢。更糟糕的是,在离开活动时,它在Lollipop下的应用程序引起了一些崩溃。它仍然比竞争对手有两个优势:
结论:我现在建议使用Picasso + OkHttp,因为它提供了最佳的灵活性,API,性能和稳定性。如果您需要GIF支持,您也可以考虑Glide。
我已经实现了一个应该不断获取并显示来自互联网的图像的应用程序。我正准备编写一个图像缓存机制,之前朋友推荐我使用通用图像加载器。
UIL非常好定制。它是如此可定制,以至于新手很容易出错。但是,UIL在我的应用程序中很慢,而且变得有点慢。我的用例是带有图像的ListView。
昨天我一直在寻找UIL的替代品,我发现了毕加索。毕加索易于整合和使用:只需Picasso.context(context).load(url).into(imageview)
,图像可以更快,更顺畅地集成。
对我来说,毕加索绝对是使用的API。我对UIL的经历并不好。
我认为与Picasso库相比,ImageLoader更具可定制性和灵活性。