美文网首页Android开发图片Android 开发收集
Glide入门教程——7. 缓存基础

Glide入门教程——7. 缓存基础

作者: 签到钱就到 | 来源:发表于2016-05-16 19:46 被阅读4178次

    Glide — 缓存基础

    原文:Caching Basics
    作者:Norman Peitek
    翻译:Dexter0218

    我们学习完了加载、显示和处理图片,我们将会向前推进学习优化处理。一个成功的高效的图片加载的基本功能是缓存。这篇文章将学习Glide中的缓存的基础知识。

    Glide 系列概览

    1. 入门简介
    2. 高级加载
    3. 适配器(ListView, GridView)
    4. 占位图& 淡入淡出动画
    5. 图片大小 & 缩放
    6. 播放GIF & 视频
    7. 缓存基础
    8. 请求优先级
    9. 缩略图
    10. 回调:定制view中使用SimpleTarget和ViewTarget
    11. 通知栏和桌面小控件的图片加载
    12. 异常: 调试和报错处理
    13. 自定义变换
    14. 用animate()定制动画
    15. 整合网络协议栈
    16. 用Modules定制Glide
    17. Glide Module 案例: 接受自签名HTTPS证书
    18. Glide Module 案例: 自定义缓存
    19. Glide Module 案例: 通过加载自定义大小图片优化
    20. 动态使用 Model Loaders
    21. 如何旋转图片
    22. 系列综述

    缓存基础

    Android应用中一个较好的图片的处理加载,会最小化网络请求的消耗。Glide也是一样,默认使用内存和磁盘缓存来避免不必要的网络请求。我们将在后续的文章中详细介绍这些细节。如果你等不及,可以去浏览一下关于这个主题的官方文档

    目前,重要的处理方式是所有的图片请求都会被缓存在内存和磁盘上。大多数情况下,缓存是一个非常有用的东西,但在一些特殊的情况下并不是很明智。在下一节中,我们会介绍如何为单独的请求调整Glide的缓存方式。

    使用缓存的策略

    如果你在前面用Glide用的很溜,你可能注意到你并不需要额外自己激活缓存。Glide本身自带缓存。然而,如果你的图片变化的非常快,你需要避免一些缓存。

    Glide提供了一些方法去避免内存缓存和磁盘缓存。我们先看看内存缓存。

    内存缓存

    我们通过一个非常简单的请求:从网络加载一个图片到ImageView:

    Glide  
        .with( context )
        .load( eatFoodyImages[0] )
        .skipMemoryCache( true )
        .into( imageViewInternet );
    

    你已经注意到我们调用了.skipMemoryCache( true )去特意告诉Glide跳过内存缓存。这意味着Glide不会把这个图片缓存到内存里。重要是,这个只影响内存缓存!Glide为了避免以后的网络请求,仍然会缓存到磁盘。

    由于Glide默认会将所有的图片资源缓存到内存中,因此,没有必要手动调用.skipMemoryCache( false )了。

    提示:注意到现实情况,如果你要对同一个URL做一个初始化的请求,第一次没使用.skipMemoryCache( true ),然后第二次使用了,将会获取缓存在内存中的资源。当你调整缓存行为的时候,确保请求的都是指向同一个资源,

    跳过磁盘缓存

    如上面所讲到的,即使你关闭了内存缓存,所请求的图片仍然会被保存在设备的磁盘存储上。如果你有一张不段变化的图片,但是都是用的同一个URL,你可能需要禁止磁盘缓存了。

    你可以用.diskCacheStrategy()方法改变Glide的行为。不同于.skipMemoryCache()方法,它将需要从枚举型变量中选择一个,而不是一个简单的boolean。如果你想要禁止请求的磁盘缓存,使用枚举型变量DiskCacheStrategy.NONE作为参数。

    Glide  
        .with( context )
        .load( eatFoodyImages[0] )
        .diskCacheStrategy( DiskCacheStrategy.NONE )
        .into( imageViewInternet );
    

    上面代码里的图片根本不会被保存在磁盘上。然后,默认情况下它仍然使用内存缓存!为了同时禁止掉两个缓存,结合一下方法:

    Glide  
        .with( context )
        .load( eatFoodyImages[0] )
        .diskCacheStrategy( DiskCacheStrategy.NONE )
        .skipMemoryCache( true )
        .into( imageViewInternet );
    

    自定义磁盘缓存行为

    我们之前提到的,Glide有很多磁盘缓存的策略。在我们展示这些选项前,你可能意识到Glide的磁盘缓存是相当复杂的。例如,Picasso只缓存全尺寸图片。Glide,会缓存原始,全尺寸的图片和额外的小版本图片。例如,如果你请求一个1000x1000像素的图片,你的ImageView是500x500像素,Glide会保存两个版本的图片到缓存里。

    现在,你应该明白.diskCacheStrategy()中枚举参数的意义了:

    • DiskCacheStrategy.NONE 啥也不缓存

    • DiskCacheStrategy.SOURCE 只缓存全尺寸图. 上面例子里的1000x1000像素的图片

    • DiskCacheStrategy.RESULT 只缓存最终降低分辨后用到的图片

    • DiskCacheStrategy.ALL 缓存所有类型的图片 (默认行为)

    作为最后一个例子,如果你有一个图片你需要经常处理它,会生成各种不同的版本的图片,缓存它的原始的分辨率图片才有意义。这样,我们使用DiskCacheStrategy.SOURCE去告诉Glide只缓存原始版本:

    Glide  
        .with( context )
        .load( eatFoodyImages[2] )
        .diskCacheStrategy( DiskCacheStrategy.SOURCE )
        .into( imageViewFile );
    

    单张图片的无效缓存

    由于Glide缓存一张图片的多个版本分辨图片,并不好轻易从缓存中删除一个文件,你需要去找到所有这个图片可能有关系的缓存。这是一个相当复杂的处理,官方wiki在无效缓存上的指导非常棒。

    展望

    在这篇文章中,你已经学会了Glide的图片缓存工作是如何进行的,并且你也能够分辨哪个缓存方式是你需要的。后续的文章中,我们将围绕更多的优化中。
    下一篇文章,我们将会学习另一个关于用户体验的关键部分,图片请求的优先级。

    相关文章

      网友评论

      • 浅安流年:谢谢分享。
      • 牛晓伟:多谢你这篇文章
      • 键盘走过的日子:你好,问一下Glide缓存到磁盘的图片有效期是多久,能自定义吗?
      • Jessewo:wonderful!
      • 萧喃:你好,我用glide加载多张gif图片,recycleview快速滑动出现OOM!
        萧喃:@GoChat 设置过磁盘缓存之后再另外一个activity中加载同一个URL地址应该不用网络上下载了,直接用上一次缓存好的,可是为什么还是从网络上重新下载下次!
        萧喃:@GoChat 设置过磁盘缓存之后再另外一个activity中加载同一个URL地址应该不用网络上下载了,直接用上一次缓存好的,可是为什么还是从网络上重新下载下次!

      本文标题:Glide入门教程——7. 缓存基础

      本文链接:https://www.haomeiwen.com/subject/xjgtrttx.html