哪个提供更好的图像加载/缓存 - Volley或Picasso?

时间:2013-05-28 00:16:13

标签: android caching android-volley universal-image-loader

我正在寻找一个开源图像加载/缓存解决方案。

我期待:

Google's Volley

Square's Picasso

Universal Image Loader

我希望能够处理来自磁盘和网络的异步图像加载,但我不确定Google的排球是否从磁盘加载。

Volley是否允许从磁盘加载资源?

An example of what I would like to do is available with AQuery.

6 个答案:

答案 0 :(得分:26)

如果您对更新/更不稳定的软件感到满意,我刚刚发布了一个名为Glide的开源库:https://github.com/bumptech/glide

它旨在让您有效地加载任何可以获得InputStream的图像。它包括一些基本的http /文件加载实现,但也允许您通过回调插入自己的或使用一些外部库(如Volley)。

它包括内存和磁盘缓存,以及新设备上的位图回收。您需要做的就是实现一个接口来获取数据模型的输入流(path / url / uri等),并将它与您想要的任何转换,占位符或动画一起传递给Glide单例。

很高兴与您或任何好奇的人交谈,我们在Bump广泛使用它与各种图书馆进行交流。

答案 1 :(得分:18)

我从http://blog.bignerdranch.com/3177-solving-the-android-image-loading-problem-volley-vs-picasso/收集了一些重要信息 (较旧的版本Picasso 2.0与凌空之间的比较)

  

Picasso完全专注于图像加载。结果,如果你有   图像加载过程中的怪癖

     另一方面,Volley完全专注于处理个人,   小的HTTP请求。因此,如果您的HTTP请求处理有一些怪癖,   排球可能有一个钩子给你。另一方面,如果你有一个   你的图像处理怪癖,你唯一真正的钩子   ImageCache。这不是什么,但它也不是很多,但它有   更多其他优点,例如定义请求后,使用它们   从片段或活动中是无痛的。与平行不同   AsyncTasks

     

Picasso只做了一件事,而Volley试图解决更多问题   一般问题。

     

Android根本无法处理高分辨率图像。我有一个小   迷恋Android中捕获OutOfMemoryError的模式   应用。这似乎是一种荒谬的战术,但是Volley是唯一的出路   与麻烦相比,可靠地处理一些图像场景   毕加索正确缩放和拟合大图像。毕加索没有   尊重ImageViews上的scaleType属性(不确定它是什么   修订于最新版本。

     

测试例:我发现Volley在加载时捕获OutOfMemoryError   原始分辨率图像而不是缩略图版本,   相比毕加索版本不会爆炸(它捕获   OutOfMemoryError也是,但是毕加索无法加载任何图像   太大了。 Volley不仅没有爆发,而且Volley全部显示出来   这些大图片!!!。

根据Android黑客Koushik Dutta

  

测试所有Android图片和http库

     

我一直在测试和评估一堆各种图像   加载和http请求库可用,因为其中有几个   在过去一周内被释放。

     

阵容:

     
      
  • AndroidAsync + UrlImageViewHelper(koush)
  •   
  • Volley(谷歌)
  •   
  • okhttp + Picasso(Square)
  •   
     

所有支持缓存和有条件缓存的响应,保持活跃,   等

     

思想:

     
      
  • Picasso拥有最好的图像API。我将为我未来/当前的东西窃取他们的currying API风格。毕加索也是   显然是最慢的。特别是3g对wifi。可能是由于   他们的自定义okhttp客户端。
  •   
  • UrlImageViewHelper + AndroidAsync是最快的。和其他两个伟大的图书馆一起玩真的突出了这个   但是,图像API过时了。
  •   
  • Volley很光滑;我真的很喜欢他们的可插拔后端传输,并可能最终放弃AndroidAsync。请求优先权
      和取消管理很棒。
  •   
     

更新这些不是真正的http库。只是图像加载器。但那里   在评论中要求进行比较......   Android-Universal-Image-Loader是最受欢迎的   目前。高度可定制。

     

AQuery;像jquery,但对于Android?我想这很好,如果你的话   进入那种事情。不要使用这个;它在UI上疯狂   线程什么的。在我的Nexus 4上加载一堆图像   listview让我觉得我又重新回到了我的HTC G1上。   主要口吃。

     

使用缓存进行测试明确:

     

冷是新鲜的app开始。使用http连接可以清除缓存   大概是活着的。

     

冷/热(以毫秒为单位,平均10次运行,每次运行清除数据):

     
      
  • Picasso 12142/11892
  •   
  • UrlImage 7378/4525
  •   
  • Volley 8292/7520
  •   
  • Android-Universal-Image-Loader 14484/11243
  •   
  • AQuery 11341/9637(这个似乎锁定了UI线程......不要使用它)
  •   
     

这是测试代码库:   https://github.com/koush/AndroidNetworkBench

     

结论:这些测试几乎没有定论。我刚用很多图像测试了并发网络访问。不可否认,还有更多   测试一个库而不是那个。我喜欢Volley在比赛中的表现   例如,活动生命周期。其他图书馆都没有这样做。

     

所以,无论你的船是什么漂浮的。我(Koush)想和Volley一起   毕加索的API。

答案 2 :(得分:4)

volley'Request类处理所有网络请求。我还没有从磁盘中找到任何类加载资源..

答案 3 :(得分:3)

开箱即用Volley不包含自己的磁盘缓存实现。如果您愿意,您需要使用DiskLruCache(或混合内存/磁盘缓存)并使其实现Volley ImageCache接口。

此博客文章总结了如何使用Volley实现基于磁盘的缓存来加载图像:http://blogs.captechconsulting.com/blog/raymond-robinson/google-io-2013-volley-image-cache-tutorial

答案 4 :(得分:3)

只需使用Picasso库:

Picasso.get()
  .load("/images/oprah_bees.gif")
  .resize(50, 50)
  .centerCrop()
  .into(imageView)

这样您就可以从file加载特定的SD,并且您也可以将imageView传递到您可以设置此图片的位置。

Picasso Library

中阅读更多功能

答案 5 :(得分:0)

Volly也可用于在磁盘上加载文件。

使用:

networkImageView.setImageUrl(Uri.fromFile(newFile(filename)).toString(),mImageFetcher);