分类
商品
商品
店铺
资讯
分类
商品
商品
店铺
资讯

Glide 4解析系列(一):如何使用Glide

  • 时间:2019-06-11 01:26 作者:二气乖张 来源:二气乖张 阅读:299
  • 扫一扫,手机访问
摘要:Glide,一个快速高效的Android图片加载库,是最常用的一个第三方框架。它不仅带来了极快的图片解码速度而且很好的处理了内存资源的压力。比方加载内存比较大的图片时,系统往往会报内存泄露的错误,这时候Glide的使用缩小了图片所占资源,大大减少了内存的压力。另外,Glide的使用也极其简单,在大部

Glide,一个快速高效的Android图片加载库,是最常用的一个第三方框架。它不仅带来了极快的图片解码速度而且很好的处理了内存资源的压力。比方加载内存比较大的图片时,系统往往会报内存泄露的错误,这时候Glide的使用缩小了图片所占资源,大大减少了内存的压力。另外,Glide的使用也极其简单,在大部分的情况下一句话即可以搞定:

Glide.with(fragment)    .load(url)    .into(imageView);

这也只是Glide其中的一种调用方法,另外还包括占位符,缓存,监听等功能。

一、增加依赖

首先在build.gradle中增加依赖

...repositories {        mavenCentral()        maven { url 'https://maven.google.com' }    }....implementation 'com.github.bumptech.glide:glide:4.8.0'annotationProcessor 'com.github.bumptech.glide:compiler:4.8.0'

假如你需要从网络上下载图片,那么就要在AndroidManifest.xml中增加Internet权限请求。

<uses-permission android:name="android.permission.INTERNET"/>

假如你需要从SD卡等外部设施读取图片,那么同样需要增加读写的权限请求。

 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

二、基本使用

以加载网络图片为例,在布局中加入一个按钮和ImageView用来存放图片。

<Button        android:id="@+id/beginLoad"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:text="开始"/>    <ImageView        android:id="@+id/imageView"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_gravity="center"/>

接着在MainActivity中开始进行加载图片的操作,如第一段的形容,Glide基本加载图片就一句话,

private String mUrl = "https://ss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=3222301344,3464718829&fm=27&gp=0.jpg";...private void loadGlide() {         Glide.with(this)                .load(mUrl)                .into(mImageView);    }...

从loadGlide()方法中可以看到,Glide从所给的Url中先把图片下载好,接着将图片放置布局所设置的ImageView中,也就完成了图片的加载。我们来看看效果:


三、占位符

在官方的文档中,Glide给出了三种不同类型的占位符,分别为占位符(placeholder)、错误符(error)、后备回调符(fallback)。

3.1、Placeholder

占位符Placeholder指在图片还未加载好时,放置在ImageView上的一个替换图片,等图片加载完成,就将这个占位图片替换掉。增加占位符也很简单.

  private void loadGlide() {        RequestOptions requestOptions = new RequestOptions()                .placeholder(R.drawable.place);        Glide.with(this)                .load(mUrl)                .apply(requestOptions)                .into(mImageView);    }

在上面基本使用的代码上加上RequestOptions,利用placeholder获取到要占位的图片,而后在Glide中加入apply方法,应用刚创立的RequestOptions。

3.2、Error

所谓的Error错误符,是在请求永久性失败的时候展现,同样也在请求的url/model为 null ,且并没有设置 fallback Drawable 时展现。
增加错误符只要要将placeholder替换掉。

  private void loadGlide() {        RequestOptions requestOptions = new RequestOptions()                .error(R.drawable.place);        Glide.with(this)                .load(mUrl)                .apply(requestOptions)                .into(mImageView);    }

由于错误符是在请求永久性失败的时候展现的,为了展现效果,就将网络关闭,这样就请求不到图片资源,error图片就会展现,如下:


3.3、Fallback

fallback Drawable 在请求的url/model为 null 时展现。设计 fallback Drawable 的主要目的是允许客户指示 null 能否为可接受的正常情况。例如,一个 null 的个人资料 url 可能暗示这个客户没有设置头像,因而应该使用默认头像。然而,null 也可能表明这个元数据根本就是不合法的,或者者取不到。 默认情况下Glide将 null 作为错误解决,所以可以接受 null 的应用应当显式地设置一个 fallback Drawable 。代码如下:

  private void loadGlide() {        RequestOptions requestOptions = new RequestOptions()                .fallback(R.drawable.place);        Glide.with(this)                .load(mUrl)                .apply(requestOptions)                .into(mImageView);    }

四、缓存机制

Glide的缓存主要分为内存缓存和磁盘缓存两部分,默认情况下,Glide 会在开始一个新的图片请求之前检查以下多级的缓存:
活动资源 (Active Resources) - 现在能否有另一个 View 正在展现这张图片?
内存缓存 (Memory cache) - 该图片能否最近被加载过并仍存在于内存中?
资源类型(Resource) - 该图片能否之前曾被解码、转换并写入过磁盘缓存?
数据来源 (Data) - 构建这个图片的资源能否之前曾被写入过文件缓存?
前两步检查图片能否在内存中,假如是则直接返回图片。后两步则检查图片能否在磁盘上,以便快速但异步地返回图片。
假如四个步骤都未能找到图片,则Glide会返回到原始资源以取回数据(原始文件,Uri, Url等)。
接下来我们从内存缓存和磁盘缓存两个方面解析Glide的缓存机制。

4.1、磁盘缓存DiskCacheStrategy

磁盘缓存DiskCacheStrategy可以被diskCacheStrategy方法应用到每一个单独的请求,比方我们通过diskCacheStrategy将缓存策略设置为DiskCacheStrategy.NONE,
那么就表示加载图片不使用磁盘缓存。另外还有其余几种策略,如下:

策略解释
DiskCacheStrategy.ALL表示原始数据,本地数据,转换后的数据都缓存
DiskCacheStrategy.AUTOMATIC表示智能的选取最好的一种缓存策略
DiskCacheStrategy.NONE表示不缓存
DiskCacheStrategy.DATA在检索之前将检索到的数据直接写入磁盘缓存
DiskCacheStrategy.RESOURCE表示缓存转换后(压缩、做过解决)的图片

磁盘缓存在代码中的使用也很简单。

 private void loadGlide() {        RequestOptions requestOptions = new RequestOptions()                .placeholder(R.drawable.place)                .diskCacheStrategy(DiskCacheStrategy.AUTOMATIC);        Glide.with(this)                .load(mUrl)                .apply(requestOptions)                .into(mImageView);    }

4.2、内存缓存

Glide在加载图片时是默认开启内存缓存,在第一次从原始资源加载图片时,Glide会将图片也加载到内存缓存中,只需资源不被消除,那么第二次加载图片时就直接从内存中读取图片。内存缓存的存在极大的提升了加载图片的速度,比方从网上获取图片,只要要第一次进行下载,第二次就不会由于网络断开或者者网络不好而加载不出图片,大大提升了客户的使用体验。

4.3、仅从缓存加载图片

例如在手机省流量的模式下,我们需要图片只从缓存中读取,那么就需要在请求中使用onlyRetrieveFromCache方法。将其设为true,图片只会从缓存中查找,假如缓存中没有,就会加载失败。

private void loadGlide() {        RequestOptions requestOptions = new RequestOptions()                .onlyRetrieveFromCache(true);                Glide.with(this)                .load(mUrl)                .apply(requestOptions)                .into(mImageView);    }

4.4、跳过缓存

例如在开发图片验证码的时候,我们就不需要将图片进行缓存,那么我们即可以将缓存关闭。

4.4.1、仅关闭内存缓存

关闭内存缓存,调用skipMemoryCache方法就可。

private void loadGlide() {        RequestOptions requestOptions = new RequestOptions()                .skipMemoryCache(true);        Glide.with(this)                .load(mUrl)                .apply(requestOptions)                .into(mImageView);    }
4.4.2、仅关闭磁盘缓存

关闭磁盘缓存在上面也已经说过,设置DiskCacheStrategy.NONE策略就可。

private void loadGlide() {        RequestOptions requestOptions = new RequestOptions()                .diskCacheStrategy(DiskCacheStrategy.NONE);        Glide.with(this)                .load(mUrl)                .apply(requestOptions)                .into(mImageView);    }
4.4.3、内存/磁盘缓存都关闭
  private void loadGlide() {        RequestOptions requestOptions = new RequestOptions()                .diskCacheStrategy(DiskCacheStrategy.NONE)                .skipMemoryCache(true);        Glide.with(this)                .load(mUrl)                .apply(requestOptions)                .into(mImageView);    }

The End.

推荐阅读:
Android自己设置View_BitmapShader实现望远镜效果
从Log中看View的事件分发机制

  • 全部评论(0)
最新发布的资讯信息
【系统环境|】补单系统搭建补单源码搭建(2022-05-18 11:35)
【系统环境|服务器应用】高端显卡再度登上热搜,竟然是因为“断崖式”的降价(2022-04-12 19:47)
【系统环境|软件环境】一步步教你开发、部署第一个去中心化应用 - 宠物商店(2022-03-15 15:13)
【系统环境|软件环境】循序渐进!一文学会高性能开发十大必需掌握的核心技术。(2022-03-15 15:13)
【系统环境|软件环境】Python游戏开发,pygame模块,Python实现贪吃蛇小游戏(2022-03-15 15:13)
【系统环境|软件环境】Spring Cloud Feign 记录单个服务耗时并处理 Hystrix 线程隔离模式!(2022-03-15 15:13)
【系统环境|软件环境】js数组方法全解(2022-03-15 15:12)
【系统环境|软件环境】字节二面:小伙子你来说下什么是伪共享?如何避免?(2022-03-15 15:12)
【系统环境|软件环境】写了Bug,误执行 rm -fr /*,我删删删删库了,要跑路吗?(2022-03-15 15:12)
【系统环境|软件环境】算法四:数字-复数计算(2022-03-15 15:12)
手机二维码手机访问领取大礼包
返回顶部