17

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

我正在寻找:

谷歌的 Volley

Square的毕加索

通用图像加载器

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

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

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

4

6 回答 6

26

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

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

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

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

于 2013-07-16T19:24:56.527 回答
18

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

Picasso 完全专注于图像加载。因此,如果您在图像加载过程中遇到问题

另一方面,Volley 完全专注于处理单个的小型 HTTP 请求。因此,如果您的 HTTP 请求处理有一些怪癖,Volley 可能会为您提供一个钩子。另一方面,如果您在图像处理方面有一个怪癖,那么您拥有的唯一真正的钩子就是 ImageCache。它不是什么都不是,但也不是很多。但它还有更多其他优点,例如一旦定义了请求,从片段或活动中使用它们就很容易。与并行 AsyncTask 不同

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

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

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

根据 Android 黑客Koushik Dutta的说法:

测试所有 Android Image 和 http 库

我一直在测试和基准测试一堆可用的各种图像加载和 http 请求库,因为其中有几个是在过去一周发布的。

排队:

  • AndroidAsync + UrlImageViewHelper (koush)
  • 排球(谷歌)
  • okhttp +毕加索(方形)

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

想法:

  • Picasso 拥有最好的图像 API。我将为我未来/当前的东西窃取他们的 currying API 风格。毕加索也明显是最慢的。尤其是在 3g 与 wifi 上。可能是由于他们的自定义 okhttp 客户端。
  • UrlImageViewHelper + AndroidAsync 是最快的。然而,与这两个伟大的库一起玩确实突出了图像 API 已经过时了。
  • 排球很光滑;我真的很喜欢他们的可插拔后端传输,最终可能会在那里放弃 AndroidAsync。请求优先级
    和取消管理很棒。

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

一个问题; 像jquery,但对于Android?我想这很好,如果你喜欢那种东西。但是不要使用这个;它在 UI 线程或其他东西上废话。在我的 Nexus 4 上的列表视图中加载一堆图像让我看起来好像又回到了我的 HTC G1 上。主要口吃。

清除缓存的测试:

冷是新的应用程序开始。温暖的是缓存清除,http 连接可能保持活动状态。

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

  • 毕加索 12142/11892
  • 网址图片 7378/4525
  • 排球 8292/7520
  • Android-Universal-Image-Loader 14484/11243
  • AQuery 11341/9637(这个好像锁住了UI线程……别用了)

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

结论:这些测试很难得出结论。我刚刚用许多图像测试了并发网络访问。诚然,测试一个库还不止这些。例如,我喜欢 Volley 在 Activity 生命周期中的表现。其他图书馆都没有这样做。

所以,无论什么都能让你的船真正飘起来。我(Koush)想要 Volley 和 Picasso 的 API。

于 2013-09-17T06:58:42.340 回答
4

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

于 2013-05-28T01:37:30.917 回答
3

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

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

于 2013-06-03T12:51:33.227 回答
3

只需使用Picasso库:

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

这将允许您加载特定file的来源,SD并且您也可以通过您imageView可以设置此图像的位置。

阅读毕加索图书馆的更多功能

于 2014-01-18T20:55:57.023 回答
0

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

采用:

networkImageView.setImageUrl(Uri.fromFile(newFile(filename)).toString(),mImageFetcher);
于 2016-01-04T11:22:07.907 回答