当前位置: 首页 > 知识库问答 >
问题:

Android本地图像缓存解决方案:方形毕加索、通用图像加载器、Glide、Fresco?

司空浩邈
2023-03-14

我正在寻找Android中的异步图像加载和缓存库。我本来打算用毕加索,但我发现通用图像加载器在GitHub上更受欢迎。有人知道这两个图书馆吗?总结一下利弊就好了。

(我所有的图像都在本地磁盘上,因此我不需要联网,因此我认为凌空截击不合适)

共有3个答案

丌官嘉勋
2023-03-14

我想与大家分享我在以下三个图书馆的经验:UIL、毕加索和凌空。我以前用过UIL,但后来我得出结论,我真的不能推荐它,我建议用截击或毕加索代替,它们都是由非常有天赋的团队开发的。UIL一点也不差,但它缺乏对其他两个库细节的关注。

我发现UIL在UI性能方面不太好;它比Volley或Picasso更倾向于锁定UI线程。这可能部分是由于UIL不支持批处理图像响应,而Picasso和Volley默认情况下这样做。

此外,我不喜欢UIL的磁盘缓存系统。虽然您可以在各种实现之间进行选择,但我需要指出,目前没有办法通过总大小和实体过期时间来限制UIL磁盘缓存。Volley和Picasso这样做了,他们默认使用服务器返回的过期时间,而UIL忽略它。

最后,UIL允许您设置全局映像加载器配置,其中包括选定的磁盘缓存和内存缓存实现和设置以及其他详细信息,但此配置将应用于您应用程序中的任何地方。因此,如果您需要更多灵活性,例如两个独立的磁盘缓存,那么UIL就不行了。另一方面,Volley允许您拥有任意数量的独立映像加载器,每个都有自己的配置。Picasso默认使用全局实例,但也允许您构建可单独配置的实例。

总结一下:Picasso拥有最好的API,但它使用所有HttpURLConnection实例之间共享的全局HTTP磁盘缓存,这在某些情况下可能过于限制。Volley具有最好的性能和模块化,但不太用户友好,并且需要您自己编写一两个模块才能使其按您想要的方式工作。总的来说,我建议将它们都与UIL一起使用。

编辑(2014年12月18日):自从我写下这个最初的答案以来,情况发生了变化,我觉得有必要改进它:

毕加索2.4甚至比旧版本更具可配置性,当与OkHttp(强烈建议)一起使用时,它还能够为每个实例使用单独的磁盘缓存,因此您可以做的事情实际上没有任何限制。更重要的是,我注意到毕加索和OkHttp的性能有了很大提高,在我看来,它现在是Android最快的图像加载解决方案。请注意,在我的代码中,我总是使用。fit()结合使用。centerCrop()。centerInside()以降低内存使用率并避免在UI线程上调整位图大小。毕加索得到了积极的发展和支持,这当然是一个很大的优势。

凌空抽射变化不大,但同时我注意到两个问题:

  • 有时在负载较重的情况下,由于某些磁盘缓存损坏,某些映像无法再加载
  • 与其他库相比,NetworkImageView(其比例类型设置为centerCrop)中显示的缩略图非常模糊

出于这些原因,我决定停止使用凌空抽射。

UIL仍然很慢(尤其是磁盘缓存),它的API有经常更改的趋势。

我还测试了这个名为Glide 3的新库,它声称使用类似毕加索的API比毕加索更优化。根据我的个人经验,即使与OkHttp结合使用,在重载下的网络请求期间,它实际上比Picasso和Volley慢。更糟糕的是,它在离开活动时导致我在Lollipop下的应用程序崩溃了几次。它仍然比竞争对手有2个优势:

  • 它支持动画GIF解码

结论:我现在建议使用Picasso OkHttp,因为它提供了最佳的灵活性、API、性能和稳定性。如果你需要GIF支持,你也可以考虑Glide。

龙德海
2023-03-14

如果您阅读Koush在G上的这篇文章,您将获得明确的解决方案来解决您的困惑,我已经将其总结为Android通用图像加载器是您需求的赢家!

>

  • 如果你在使用网络,毕加索有最好的图像API!

    UrlImageViewHelper AndroidAsync是最快的。然而,通过使用这两个强大的库,我们可以发现图像API已经过时了。

    凌空抽射很流畅;我真的很喜欢他们的可插拔后端传输,
    可能最终会在那里放弃AndroidAsync。请求优先级和取消管理非常好(如果您使用网络)

    Android Universal Image Loader是目前最流行的一款。高度可定制。

    该项目旨在为异步图像加载、缓存和显示提供可重用的工具。它最初基于Fedor Vlasov的项目,此后进行了大量重构和改进。

    新UIL版本(1.9.2)即将进行的更改:

    可以从UI线程中调用ImageLoader新的磁盘缓存API(更灵活)。基于Jake Wharton的DiskLruCache的新LRudisCache。

    考虑到所有这些Android通用图像加载器符合您的要求(加载图像在本地磁盘上)!

  • 宦琪
    2023-03-14

    2018年9月更新:几年后,我需要一个本地图像缓存解决方案几乎相同的东西。这一次,UIL没有得到积极的发展。我比较了流行的库,得出的结论非常简单:只需使用Glide。它更强大,更可配置。几年前,我不得不对UIL进行修改。Glide在缓存策略和使用自定义键的多级分辨率缓存方面支持我的所有用例。只需使用Glide!

    Koushik Dutta的比较主要是针对速度基准。他的帖子只涉及了非常基本的东西,并没有针对当地的图片。问了这个问题后,我想和大家分享一下我与毕加索和UIL的经历。毕加索和UIL都可以加载本地图像。我第一次尝试毕加索,很高兴,但后来我决定切换到UIL的更多定制选项。

    毕加索:

    >

  • 毕加索流畅的界面很好。但是随着“with”、“into”、“load”跳来跳去,你实际上不知道幕后是什么。返回的内容令人困惑。

    毕加索允许您指定精确的目标大小。当你有内存压力或性能问题时,它很有用,你可以用一些图像质量来换取速度。

    缓存的图像的键中包含大小,这在显示不同大小的图像时非常有用。

    您可以自定义内存缓存大小。但它的磁盘缓存仅适用于超文本传输协议请求。对于本地图像,如果您关心加载速度,最好有一个缩略图磁盘缓存,这样您就不必每次都为一个图像读取多个MB。毕加索没有这种在磁盘上调整大小和保存缩略图的机制。

    Picasso不会公开对其缓存实例的访问权限。(您可以在首次配置Picasso并将其保留在周围时获得它...)。

    有时您想将图像异步读取到侦听器返回的位图中。令人惊讶的是毕加索没有这样做。“fetch()”不会传回任何东西。“get()”用于同步读取,“load()”用于异步绘制视图。

    Picasso在主页上只有几个简单的例子,您必须通读无序的javadoc才能获得高级用法。

    UIL:

    >

  • UIL使用构建器进行定制。几乎所有东西都可以配置。

    UIL不允许您指定要加载到视图中的大小。它使用一些基于视图大小的规则。它不像毕加索那样灵活。我没有办法加载较低分辨率的图像来减少内存占用。(编辑:可以通过在源代码中添加ImageSize参数并绕过视图大小检查来轻松修改此行为)

    UIL提供了可自定义的磁盘缓存,您可以使用它来缓存指定大小的缩略图。但这并不完美。以下是详细信息。(编辑:如果你关心速度,想要多级缩略图缓存,比如我的情况,你可以修改源代码,让磁盘缓存使用“memoryKey”,并使其对大小敏感)

    默认情况下,UIL在内存中缓存不同大小的图像,并且可以在配置中关闭。

    UIL公开您可以访问的后备内存和磁盘缓存。

    UIL提供了灵活的方式,您可以获取位图或加载到视图。

    UIL在文档方面更好。UIL在Github页面上给出了详细的用法,并且有一个链接教程

    我建议从毕加索开始,如果你需要更多的控制和定制,可以选择UIL。

  •  类似资料:
    • 问题内容: 问题描述: 我正在创建一个滚动的带有缩略图的文章列表,该列表由我的SQLite数据库填充。通常,它运行缓慢,但速度较慢: 图像加载非常缓慢…我想使用“ 通用图像加载器 ”将图像缓存在设备上,如果您已经查看过图像(或者至少接近该图像,那会使它们看起来只是滚动到视图中) )。但是- 当您向上/向下拖动时,没有任何图像,然后在3-5秒后,图像开始弹出(就像重新下载它们一样) 我正在动态更改缩

    • 我正在使用毕加索图书馆。我知道,如果我将图片从URL加载到图像视图中,有一种回调方法。但我不想加载到imageview中。相反,我想将其另存为位图。所以我用了下面的代码 我怎样才能得到一个回调方法,知道我的图像是成功下载使用毕加索? 不要说位图对象的空检查。这会导致错误。

    • 我正试图使用GridView毕加索\通用图像加载器制作一个画廊,我遇到了一些问题。每次我只加载本地文件(从外部存储),而不是从web。我制作了两个视频,更好地描述了问题,然后是文字。 我使用自定义适配器扩展BaseAdapter。 是带有图像的数组 加载图像速度足够快,但滚动速度非常慢。这是youtube上的视频演示 滚动速度快,但加载速度慢。此外,当你快速滚动时,你可以看到错误的图像,这些图像将

    • 我正在使用volley向tmdb数据库发出RESTAPI请求,以加载有关电影的信息。回收器视图应显示缩略图图像海报。但它没有显示任何东西。我正在使用毕加索图书馆加载图像。图像链接构造得很好,我已经用log语句检查过了 主要活动。xml 列出项目布局。xml 主要活动 电影数据加载器

    • 我已经创建了印地语视频歌曲应用程序,但视频拇指不能显示在视频列表中。(已加载单个图像,但无法加载多个图像阵列。) 使用多图像加载程序库但不加载图像: 滑动: 毕加索: 将请求管理器与glide一起使用: 后台任务方法使用: 请帮助我如何解决这个问题。

    • 4.使用自定义适配器在ListView中显示图像。 我只是对步骤1和2有问题。我可以从服务器获取新闻,并在我的ListView中显示它们 并通过在我的适配器中添加以下代码显示缓存中的图像: