Android的图像加载 – 排气与毕加索

我正在寻找一个开源的图像加载/caching解决scheme。

我正在寻找:

Google的Volley ,

广场的毕加索

通用图像加载器

我想能够处理从磁盘以及networkingasynchronous图像加载,但我不知道如果谷歌的凌空手柄从磁盘加载。

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

AQuery提供了一个我想要做的例子。

Solutions Collecting From Web of "Android的图像加载 – 排气与毕加索"

凌空'请求类处理所有networking请求。 我无法从磁盘find任何类加载资源..

如果你对新的/不太稳定的软件还好,我刚刚发布了一个名为Glide的开源库: https : //github.com/bumptech/glide

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

它包括内存和磁盘caching,以及在新设备上的位图回收。 所有你需要做的就是实现一个接口,为你的数据模型(path / url / uri等等)获取一个inputstream,并将它传递给你想要的Glide单例的任何转换,占位符或者animation。

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

我收集了一些来自http://blog.bignerdranch.com/3177-solving-the-android-image-loading-problem-volley-vs-picasso/的重要信息(比较早期的毕加索2.0和排雷)

毕加索完全专注于图像加载。 因此,如果你的图像加载过程中有怪癖

另一方面,Volley完全专注于处理单个的小型HTTP请求。 所以如果你的HTTP请求处理有一些怪癖,Volley可能有一个钩。 另一方面,如果你在image processing方面有一个怪癖,你唯一的真正的钩子就是ImageCache。 这不是什么,但也不是很多,但它有更多的其他优点,如定义你的请求,从一个片段或活动中使用它们是无痛的。 而不像平行的AsyncTasks

毕加索只做一件事,而沃利试图解决一个更普遍的问题。

Android根本无法处理高分辨率的图像。 我对在Android应用程序中捕捉OutOfMemoryError的模式有点迷恋。 这似乎是一种荒谬的策略,但是Volley是可靠地处理一些图像场景的唯一方式,而与毕加索缩放和正确匹配大图像的麻烦相比。 毕加索不尊重ImageViews上的scaleType属性(不确定它是否在最新版本中已修复)。

testing例子:我发现Volley在加载原始分辨率图像而不是缩略图版本时捕获了OutOfMemoryError,与毕加索版本相比,它并没有爆炸(它也捕获了OutOfMemoryError),但是毕加索无法加载任何太大的图像。 Volley不仅没有爆炸,而且Volley显示所有这些大图像!

根据Android Hacker Koushik Dutta的说法 :

testing所有的Android图像和HTTP库

我一直在testing和基准化各种可用的图像加载和http请求库,因为其中有一些是在过去一周内发布的。

排队:

  • AndroidAsync + UrlImageViewHelper(koush)
  • Volley(Google)
  • okhttp +毕加索(Square)

所有支持caching和有条件caching的响应,保持活跃等。

思考:

  • 毕加索拥有最好的图像API。 我将为我的未来/现在的东西偷他们的咖啡风格。 毕加索也是最慢的。 特别是3g vs wifi。 可能是由于他们的自定义okhttp客户端。
  • UrlImageViewHelper + AndroidAsync是最快的。 玩这两个伟大的图书馆真的强调,图像API是相当过时的,但是。
  • 凌空是光滑的; 我真的很喜欢他们的可插拔后端传输,并最终可能会丢弃AndroidAsync。 请求优先
    和取消pipe理是伟大的。

更新这些不是真正的http库。 只是图像装载机。 但在评论中有要求进行比较… Android-Universal-Image-Loader是目前最stream行的一种。 高度可定制。

一个问题; 像jquery,但为Android? 我想这很好,如果你是这样的事情。 不要使用这个。 它在UI线程或其他什么东西。 在列表视图中加载我的Nexus 4上的一大堆图像,看起来好像我又回到了我的HTC G1。 主要口吃。

高速cachingtesting明确:

冷是新鲜的应用程序开始。 温暖是高速caching清除与http连接大概保持活着。

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

  • 毕加索12142/11892
  • UrlImage 7378/4525
  • 排球8292/7520
  • Android-Universal-Image-Loader 14484/11243
  • AQuery 11341/9637(这似乎locking了UI线程…不要使用它)

以下是testing代码库: https : //github.com/koush/AndroidNetworkBench

结论:这些testing很难确定。 我刚刚testing了许多图像并发的networking访问。 无可否认,除了testing一个库,还有更多。 例如,我喜欢Volley如何在Activity的生命周期中performance出色。 没有其他的图书馆这样做。

所以,无论如何漂浮你的船真的。 我(Koush)想用毕加索的API来想Volley。

开箱即用Volley不包括自己的磁盘caching实现。 你需要一个DiskLruCache(或者你喜欢的混合内存/磁盘caching),并让它实现Volley ImageCache接口。

本博文总结了如何使用Volley实现基于磁盘的caching以加载图像: http : //blogs.captechconsulting.com/blog/raymond-robinson/google-io-2013-volley-image-cache-tutorial 。

只要使用Picasso图书馆:

 Picasso.with(context).load(new File("/images/oprah_bees.gif")).into(imageView2); 

这将允许你从SD加载特定的file ,你也可以通过imageView来设置这个图像。

读更多function到毕加索图书馆

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

使用:

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