Glide 4解析系列(一):如何使用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 4解析系列(一):如何使用Glide》 图片发自简书App

三、占位符

在官方的文档中,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图片就会展示,如下:

《Glide 4解析系列(一):如何使用Glide》 图片发自简书App

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的事件分发机制

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