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

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,会缓存原始,全尺寸的图片和额外的小版本图片。例如,如果你请求一个1000×1000像素的图片,你的ImageView是500×500像素,Glide会保存两个版本的图片到缓存里。

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

  • DiskCacheStrategy.NONE 啥也不缓存

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

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

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

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

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

单张图片的无效缓存

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

展望

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

    原文作者:签到钱就到
    原文地址: https://www.jianshu.com/p/f5cc71c8eb3f
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞