Android的本地图像caching解决scheme:Square Picasso vs Universal Image Loader

我正在寻找Android中的asynchronous图像加载和caching库。 我打算使用毕加索,但是我发现Universal Image Loader在GitHub上更受欢迎。 有谁知道这两个库? 利弊总结会很好。

(我所有的镜像都在本地磁盘上,所以我不需要联网,因此我不认为惠利是合适的)

Koushik Dutta的比较主要是基准速度。 他的文章只涉及非常基本的东西,并不是特定于本地的图像。 我想提出这个问题后,我想分享一下毕加索和UIL的经验。 毕加索和UIL都可以加载本地图像。 我第一次尝试毕加索,很高兴,但后来我决定切换到UIL更多的定制选项。

毕加索:

  • 毕加索stream畅的界面很不错。 但是随着“随着”,“进入”,“负载”跳跃,你实际上不知道背后是什么。 这是令人困惑的回报。

  • 毕加索允许您指定确切的目标大小。 当你有内存压力或性能问题,这是有用的,你可以权衡一些图像质量的速度。

  • 图像caching大小的关键,当你显示不同大小的图像是有用的。

  • 您可以自定义内存caching大小。 但是它的光盘caching仅用于http请求。 对于本地映像,如果您关心加载速度,最好有一个缩略图磁盘caching,因此您不必每次都读取一个映像的多个MB。 毕加索没有这个机制resize和保存在磁盘上的缩略图。

  • 毕加索不公开对其caching实例的访问。 (当你第一次configuration毕加索时,你可以抓住它,并保持它…)。

  • 有时你想asynchronous读取图像到一个监听器返回的位图。 令人惊讶的毕加索没有这个。 “fetch()”不会传回任何东西。 “get()”用于同步读取,“load()”用于asynchronous绘制视图。

  • 毕加索在主页上只有一些简单的例子,你需要阅读无序的javadoc以获得更高级的用法。

UIL:

  • UIL使用build设者进行定制。 几乎所有的东西都可以configuration。

  • UIL不允许指定要加载到视图中的大小。 它使用一些基于视图大小的规则。 它没有毕加索那么灵活。 我无法加载较低分辨率的图像来减less内存占用。 (编辑:通过在源代码中添加一个ImageSize参数并绕过视图大小检查,可以轻松修改此行为)

  • UIL提供了可自定义的光盘caching,您可以使用它caching指定大小的缩略图。 但这并不完美。 这里是细节 。 (编辑:如果你关心速度,想要多级缩略图caching,就像我的情况一样,你可以修改源代码,让磁盘caching使用“memoryKey”,并使其对大小敏感)

  • 默认情况下,UIL在内存中caching不同大小的图像,并可以在configuration中closures。

  • UIL公开可以访问的后备内存和磁盘caching。

  • UIL提供了灵活的方式来获取位图或加载到视图。

  • UIL在文档上更好。 UIL给出了Github页面上的详细用法,还有一个链接教程。

我build议从毕加索开始,如果你需要更多的控制和定制,去UIL。

如果您在K +上阅读G +的这篇文章,您将会得到明确的解决scheme,我已经把这个总结,在Android的通用图像加载器是你的要求的胜利者!

  • 如果您使用networking, 毕加索有最好的图像API!

  • UrlImageViewHelper + AndroidAsync是最快的。 玩这两个伟大的图书馆真的强调,图像API是相当过时的,但是。

  • 凌空是光滑的; 我真的很喜欢他们的可插式后端传输,
    并最终可能会在那里放弃AndroidAsync。 请求优先
    和取消pipe理是伟大的(如果你正在使用networking)

  • Android-Universal-Image-Loader是最受欢迎的一款
    目前。 高度可定制。

该项目旨在为asynchronous图像加载,caching和显示提供可重复使用的工具。 它最初是以Fedor Vlasov的项目为基础的,从那以后,这个项目得到了大量的重构和改进。

新的UIL版本(1.9.2)即将发生的变化:

可以从UI线程调用ImageLoaderNew Disk Cache API(更灵活)。 基于Jake Wharton的DiskLruCache的新LruDiscCache。

考虑到所有这些Android-Universal-Image-Loader套件的要求( 加载图像在本地磁盘上 )!

我想与这三个图书馆分享我的经验:UIL,Picasso和Volley。 我之前使用过UIL,但是后来我得出了一个结论,我不能真正推荐它,所以我会build议使用Volley或Picasso,而这些都是由非常有才华的团队开发的。 UIL一点也不差,但是对其他两个图书馆的细节缺乏注意。

我发现UIL对UI性能不太好, 它比Volley或Picasso更倾向于lockingUI线程。 这可能部分归因于UIL不支持批量处理图像响应,而毕加索和Volley默认这样做。

另外,我不喜欢UIL的磁盘caching系统。 虽然您可以在各种实现之间进行select,但我需要指出的是,目前无法通过总大小和实体到期时间来限制UIL磁盘高速caching。 Volley和Picasso这样做,他们使用服务器默认返回的到期时间,而UIL忽略它。

最后,UIL允许您设置全局图像加载器configuration,其中包括选定的磁盘caching和内存caching实现和设置以及其他细节,但是此configuration将在您的应用程序的任何位置应用。 所以,如果你需要更多的灵活性,像两个独立的磁盘caching,这是一个不行的UIL。 另一方面,Volley允许您拥有尽可能多的独立图像加载器,每个都有自己的configuration。 毕加索默认使用全局实例,但也允许您构build单独的可configuration实例。

综上所述:Picasso拥有最好的API,但是它使用了所有HttpURLConnection实例之间共享的全局HTTP磁盘caching,在某些情况下这可能太严格了。 排雷具有最好的性能和模块化,但不太友好,需要你写一个或两个你自己的模块,使其工作,如你所愿。 总的来说,我会推荐他们对UIL。

编辑(2014年12月18日):自从我写下这个最初的答案以来,情况发生了变化,我觉得有必要改进它:

Picasso 2.4比旧版本更具可configuration性,当与OkHttp(强烈推荐)一起使用时,它也能够为每个实例使用单独的磁盘caching,因此对于您可以执行的操作实际上没有任何限制。 更重要的是,我注意到毕加索和OkHttp的性能有了很大提高 ,在我看来,它是目前Android上最快的图像加载解决scheme。 请注意,在我的代码中,我总是使用.fit().centerCrop().centerInside()来降低内存使用率,并避免在UI线程上调整位图大小。 毕加索是积极发展和支持,这当然是一个很大的优势。

Volley并没有改变那么多,但同时我注意到了两个问题:

  • 有时在负载较重的情况下,由于某些磁盘caching损坏,某些图像不再被加载。
  • NetworkImageView中显示的缩略图(其缩放types设置为centerCrop)与其他库相比,显得非常模糊。

出于这些原因,我决定停止使用Volley。

UIL仍然是缓慢的(特别是磁盘caching),它的API有一个经常改变的趋势。

我还testing了这个名为Glide 3的新库,它声称比Picasso更像一个类似毕加索的API。 根据我个人的经验,在负载较重的networking请求中,它实际上比Picasso和Volley慢,即使与OkHttp结合使用。 更糟糕的是,离开一个活动时,它在棒棒糖下的应用程序导致了一些崩溃。 它仍然比竞争对手有两个优势:

  • 它支持animationGIF解码
  • 它将最终的缩减位图放入磁盘caching中,这意味着从磁盘caching中读回的速度非常快。

结论:我现在推荐使用Picasso + OkHttp,因为它提供了最好的灵活性,API,性能和稳定性相结合。 如果你需要GIF支持,你也可以考虑滑翔。

我已经实现了一个应用程序,应该不断地从互联网上获取和显示图像。 我正要编程一个图像caching机制,然后朋友推荐我的通用图像加载器。

UIL是非常好的可定制的。 这是可定制的,新手可以很容易地做错了事情。 然而,UIL在我的应用程序是慢的,它变得有点慢。 我的用例是带有图像的ListView。

昨天我正在寻找UIL的替代品,我发现了毕加索。 毕加索很容易整合和使用:只需Picasso.context(context).load(url).into(imageview)和图像可以更快,更顺利地进行整合。

对我来说,毕加索绝对是使用的API。 我与UIL的经验并不好。

我认为ImageLoader比毕加索图书馆更具可定制性和灵活性。