我正在寻找一个开源图像加载/缓存解决方案。
我正在寻找:
我希望能够处理来自磁盘和网络的异步图像加载,但是我不确定 Google 的 volley 句柄是否从磁盘加载。
Volley 是否允许从磁盘加载资源?
我正在寻找一个开源图像加载/缓存解决方案。
我正在寻找:
我希望能够处理来自磁盘和网络的异步图像加载,但是我不确定 Google 的 volley 句柄是否从磁盘加载。
Volley 是否允许从磁盘加载资源?
如果您对更新/不太稳定的软件没意见,我刚刚发布了一个名为 Glide 的开源库:https ://github.com/bumptech/glide
它旨在让您有效地加载可以获取 InputStream 的任何图像。它包括一些基本的 http/文件加载实现,但也允许您插入自己的或通过回调使用一些外部库(如 Volley)。
它包括内存和磁盘缓存,以及较新设备上的位图回收。您需要做的就是实现一个接口来获取数据模型的输入流(路径/url/uri 等),并将它与您想要的任何转换、占位符或动画一起传递给 Glide 单例。
很高兴与您或任何好奇的人交谈,我们在 Bump 广泛使用它来与各种库进行交互。
我从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。
volley' Request 类处理所有的网络请求。我还没有从磁盘中找到任何类加载资源..
开箱即用的 Volley 不包括自己的磁盘缓存实现。您需要使用 DiskLruCache(或混合内存/磁盘缓存,如果您愿意)并让它实现 Volley ImageCache 接口。
这篇博文总结了如何使用 Volley 实现基于磁盘的缓存来加载图像:http: //blogs.captechconsulting.com/blog/raymond-robinson/google-io-2013-volley-image-cache-tutorial。
只需使用Picasso
库:
Picasso.get()
.load("/images/oprah_bees.gif")
.resize(50, 50)
.centerCrop()
.into(imageView)
这将允许您加载特定file
的来源,SD
并且您也可以通过您imageView
可以设置此图像的位置。
阅读毕加索图书馆的更多功能
Volly 也可用于加载磁盘上的文件。
采用:
networkImageView.setImageUrl(Uri.fromFile(newFile(filename)).toString(),mImageFetcher);