【问题标题】:Which provides better Image Loading/Caching - Volley or Picasso?哪个提供更好的图像加载/缓存 - Volley 或 Picasso?
【发布时间】:2013-05-22 20:07:10
【问题描述】:

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

我正在寻找:

Google's Volley,

Square's Picasso

Universal Image Loader

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

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

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

【问题讨论】:

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


【解决方案1】:

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

【讨论】:

  • 不幸的是,这似乎是这种情况。我喜欢毕加索的那个功能,所以我必须选择....
【解决方案2】:

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

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

【讨论】:

  • 感谢您的评论,但我正在寻找一种从文件加载现有图像的方法,而不是缓存。我希望 Volley 能够处理异步加载图像以及加载图像的所有性能问题。
  • 抱歉。 Volley 是一个网络请求库,我假设你是在从磁盘缓存之后。据我所知,它没有任何用于从磁盘加载资产的类。
  • 这不是真的。查看 Volley 源代码中的 CacheDispatcherDiskBaseCache 类。
  • 你是对的。早期的文档很少。在我写完原始博客后不久,我发现了实现 Volley 所需的方法并更新了博客以反映正确的方法。
【解决方案3】:

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

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

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

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

【讨论】:

  • +1,有趣! Volley 有它自己的图像加载器类(NetworkImageView),你能解释一下将 volley 插入 Glide 有什么好处吗?为什么不能直接使用 NetworkImageView?
  • 基本上 Volley 的图像加载代码充其量只是基本的。它真的专注于网络操作,图像加载代码似乎是事后才添加的。 Glide 为您提供了 Volley 的 NetworkImageView 所没有的大量功能,包括更高效的磁盘和内存缓存,以及位图回收、exif 处理以及大量优化以使图像加载顺畅和快速。我将 Volley 用于 Glide 是因为我想包含对显示远程图像的支持,而且它似乎是最好的库。
  • @Monkeyless 嗨!有没有办法告诉 Glide 在加载位图时使用哪个 Bitmap.Config?例如。如果我想强制一些特定的。
  • 您好,感谢您的提问!不幸的是,没有一种简单的方法可以做到这一点。您最好的选择是应用将位图转换为您想要的特定类型的转换。 Glide 尝试智能地选择格式以节省内存(RGB_565 是每像素 2 字节,ARGB_8888 是每像素 4 字节),但这并不能直接改变。在即将到来的 3.0 分支中,我会尽我所能让这一切变得更容易:(github.com/bumptech/glide/tree/3.0a)
  • 它甚至还集成了 Volley!我会看看它。 +1!!
【解决方案4】:

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

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

另一方面,排球完全专注于处理个人, 小的 HTTP 请求。因此,如果您的 HTTP 请求处理有一些怪癖, Volley 可能有一个适合你的钩子。另一方面,如果您有一个 图像处理中的怪癖,您拥有的唯一真正的钩子是 图像缓存。不是什么都没有,但也不是很多。但它有 更多其他优势,例如一旦定义了请求,就可以使用它们 从片段或活动内部是无痛的。与并行不同 异步任务

毕加索只做一件事,而沃利试图解决更多 一般问题。

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

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

根据Android HackerKoushik Dutta

测试所有 Android Image 和 http 库

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

阵容:

  • AndroidAsync + UrlImageViewHelper (koush)
  • 排球(谷歌)
  • okhttp + Picasso(方形)

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

想法:

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

更新这些并不是真正的 http 库。只是图像加载器。但那里 是在 cmets 中进行比较的请求... Android-Universal-Image-Loader 是最流行的 现在。高度可定制。

查询;像jquery,但对于Android?我想这很好,如果你是 进入那种事情。但是不要使用这个;它在用户界面上胡扯 线程什么的。在我的 Nexus 4 上加载一堆图像 listview 让我仿佛又回到了我的 HTC G1 上。 严重口吃。

清除缓存的测试:

冷是新的应用程序启动。温暖是使用 http 连接清除缓存 大概还活着。

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

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

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

结论:这些测试很难得出结论。我刚刚用许多图像测试了并发网络访问。诚然,还有更多 比那测试一个库。我喜欢 Volley 与 例如,活动生命周期。其他库都没有这样做。

所以,不管你的船真的飘起来了。我(库什)想要凌空抽射 Picasso 的 API。

【讨论】:

    【解决方案5】:

    只需使用Picasso 库:

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

    这将允许您从SD 加载特定的file,并且您也可以传递imageView,您可以在其中设置此图像。

    阅读更多功能到Picasso Library

    【讨论】:

      【解决方案6】:

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

      用途:

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

      【讨论】:

        猜你喜欢
        • 2016-07-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-16
        • 2016-03-11
        • 1970-01-01
        • 2013-10-24
        • 2014-03-17
        相关资源
        最近更新 更多