android 圖片加載庫(2)- Glide

說在開頭

Glide 最早是 google 內(nèi)部員工的作品帽哑,后來被 google 發(fā)掘力推嘿悬,15关面,16年可火了,但是奈何漸漸不敵 Fresco 速蕊,F(xiàn)resco 的占用內(nèi)存低的優(yōu)勢真是太強大了圆裕,因為 Fresco 使用了系統(tǒng)的共享內(nèi)存际歼,而不是 JVM 虛擬機所屬的內(nèi)存塊说莫。但是 Glide 是非常適合用來學(xué)習(xí)的,Glide 的代碼結(jié)構(gòu)非常優(yōu)秀赢赊,記得郭琳郭姐說過乙漓,要是能把 Glide 用心讀一遍,都會獲得脫胎換骨的變化的释移,對于我們加強叭披,進化自己的 java 基本功大有裨益啊。

Glide 官方中文文檔: Glide v4 快速高效的Android圖片加載庫 玩讳,推薦大家都去看一下涩蜘,尤其是打算研究源碼的同學(xué)們


Glide 集成

Glide 現(xiàn)在處于 V 4.X 版本,較上一個版本 V 3.X 變動較大熏纯,大家注意一下同诫。

Glide 依賴
repositories {
  mavenCentral()
  maven { url 'https://maven.google.com' }
}

dependencies {
    compile 'com.github.bumptech.glide:glide:4.5.0'
    annotationProcessor 'com.github.bumptech.glide:compiler:4.5.0'
}

上面是官方給出的依賴地址,注意遠程庫地址可是 google 自己的地址樟澜,一般人都沒寫過這個地址误窖,注意加上啊叮盘。第二個依賴是 Glide 的注解,版本號保持和 Glide 一致霹俺,這個注解的依賴可以不加柔吼,但是若是要全局設(shè)置 Glide 參數(shù)就必須使用了。

Glide 版本 android 編譯版本
glide:4.5.0 appcompat-v7:27.0.2
glide:4.4.0 appcompat-v7:27.0.2
glide:4.3.1 appcompat-v7:26.1.0

注意 Glide 版本號對 android 編譯版本有最低要求丙唧,不匹配就報錯愈魏,這點要特殊注意。下面是 Glide 歷史版本對 android 編譯版本匹配要求:

Glide 版本 android 編譯版本
glide:4.5.0 appcompat-v7:27.0.2
glide:4.4.0 appcompat-v7:27.0.2
glide:4.3.1 appcompat-v7:26.1.0

如果你需要使用不同的支持庫版本想际,你需要在你的 build.gradle 文件里去從 Glide 的依賴中去除 "com.android.support"培漏。例如,假如你想使用 v26 的支持庫:

dependencies {
  implementation ("com.github.bumptech.glide:glide:4.5.0") {
    exclude group: "com.android.support"
  }
  implementation "com.android.support:support-fragment:26.1.0"
}

注意 Glide 依賴與支持庫版本不兼容沼琉,會出現(xiàn)下面這個運行時異常:

java.lang.NoSuchMethodError: No static method getFont(Landroid/content/Context;ILandroid/util/TypedValue;ILandroid/widget/TextView;)Landroid/graphics/Typeface; in class Landroid/support/v4/content/res/ResourcesCompat; or its super classes (declaration of 'android.support.v4.content.res.ResourcesCompat' 
at android.support.v7.widget.TintTypedArray.getFont(TintTypedArray.java:119)

不推薦在依賴中使用 @aar 北苟,如果必須這么做,請?zhí)砑?transitive=true 以確保所有必要的類都被包含到你的 API 中:

dependencies {
    implementation ("com.github.bumptech.glide:glide:4.5.0@aar") {
        transitive = true
    }

不設(shè)置 transitive 可能會出現(xiàn)這個異常打瘪,另外若是還出現(xiàn)這個異常,就不要在依賴中使用 @aar

java.lang.NoClassDefFoundError: com.bumptech.glide.load.resource.gif.GifBitmapProvider
    at com.bumptech.glide.load.resource.gif.ByteBufferGifDecoder.<init>(ByteBufferGifDecoder.java:68)
    at com.bumptech.glide.load.resource.gif.ByteBufferGifDecoder.<init>(ByteBufferGifDecoder.java:54)
    at com.bumptech.glide.Glide.<init>(Glide.java:327)
    at com.bumptech.glide.GlideBuilder.build(GlideBuilder.java:445)
    at com.bumptech.glide.Glide.initializeGlide(Glide.java:257)
    at com.bumptech.glide.Glide.initializeGlide(Glide.java:212)
    at com.bumptech.glide.Glide.checkAndInitializeGlide(Glide.java:176)
    at com.bumptech.glide.Glide.get(Glide.java:160)
    at com.bumptech.glide.Glide.getRetriever(Glide.java:612)
    at com.bumptech.glide.Glide.with(Glide.java:684)
Glide 混淆
-keep public class * implements com.bumptech.glide.module.GlideModule
-keep public class * extends com.bumptech.glide.module.AppGlideModule
-keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {
  **[] $VALUES;
  public *;
}

# for DexGuard only
-keepresourcexmlelements manifest/application/meta-data@value=GlideModule

Glide 所需權(quán)限

Glide 權(quán)限這塊就是需要 : 讀寫 SD 卡權(quán)限傻昙,其他沒有了

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

Generated API - Glide 的全局設(shè)置

這個是 Glide V4 版本新添加的內(nèi)容闺骚,全局設(shè)置的 option 可以在單個請求中替換。Glide 給大家提供這樣一個全局設(shè)置的位置妆档,就是想讓我們的可以服用這些關(guān)于圖片加載的公共業(yè)務(wù)設(shè)置僻爽,以方便我們可以更高度,更優(yōu)秀的組織我們的圖片加載代碼贾惦,甚至是編寫我們自己的圖片加載業(yè)務(wù)庫胸梆,大家不要忘了,時間是不斷流逝的须板,說不準哪天就是我們替換圖片加載庫的時候了呢碰镜,所以優(yōu)良的代碼架構(gòu)設(shè)計和業(yè)務(wù)功能框架的封裝就顯得有味必要了。這里 Glide 新版本給我們能提供更為便利的操作习瑰。

2個全局設(shè)置基類 AppGlideModule / LibraryGlideModule

首先我們需要按照如下這樣绪颖,在我們的 app 中聲明一個類

@GlideModule
public final class MyAppGlideModule extends AppGlideModule {
    ......
}

這個類需要繼承 AppGlideModule 這個 Glide 提供給我們的類,注意關(guān)于這個類有以下要求:

  • Application 級別的 module 也就是我們常用的 app module中甜奄,我們要繼承 AppGlideModule 這個類
  • 而 Library 級別的 module 我們就要繼承 LibraryGlideModule 這個類
  • 注意上面2個類不要用混柠横,要不無法正常使用代碼的
  • 必須使用 @GlideModule 這個注解來修飾我們的這個類,@GlideModule 這個注解是 Glide 用來遍歷代碼课兄,查詢我們定義的全局配置類的關(guān)鍵
  • 我們定義的全局配置類可以是空的實現(xiàn)牍氛,雖然這個要求不是必須的,但是官方還是辦強制的要求我們這么做
  • 從上面的2個不同的基類來看烟阐,其實我們可以舍棄 AppGlideModule 而使用 LibraryGlideModule 的搬俊,我們會把 app 根據(jù)業(yè)務(wù)和功能拆分成業(yè)務(wù)和基礎(chǔ)功能 module 的踱稍,在所有的 module 中,圖片加載的配置應(yīng)該是統(tǒng)一的悠抹,這樣我們就要把圖片加載也做成一個單獨的功能 module 珠月,或是抽象到業(yè)務(wù)基礎(chǔ)功能庫 module 中,這樣在 Library 級別的 module 中楔敌,我們就只想使用 LibraryGlideModule 這個父類了啤挎。

然后我們就可以使用 Glide 的統(tǒng)一入口來調(diào)用 Glide 的 API 了。上面說過來了 Glide 的設(shè)計思路是很棒的卵凑,使用 bulider 建造者模式來統(tǒng)一存儲庆聘,設(shè)置相關(guān)的各種 option 。使用全局靜態(tài)單例的方式來給我們提供統(tǒng)一的公共入口勺卢,這樣的 API 非常之簡潔伙判,是我們編寫基礎(chǔ)功能庫的最優(yōu)秀方案。

Glide 的公共入口有2個類黑忱,按照不同的配置情況來使用:

  • Glide :我們?nèi)羰遣慌渲萌峙渲妙惖脑捬绺В陀?Glide 這個類
  • GlideApp :我們?nèi)羰桥渲昧巳峙渲妙惖脑挘陀?GlideApp 這個類

這2個類的區(qū)別除了全局配置以外甫煞,就是 API 的使用上了菇曲,Glide 在 API 使用上是鏈式調(diào)用的寫法,很方便抚吠。使用 GlideApp 這個類常潮,對我們使用 API 沒影響,但是 Glide 這個類楷力,我們只能鏈式使用最基礎(chǔ)的2個 API:

GlideApp.with(context)
             .load("圖片地址")
             .into(getImage());

所用從使用上來看喊式,官方是半強制的讓我們使用 GlideApp 這個類,也就是讓我們進行全局配置萧朝。

全局配置類中我們可以做什么

還是得從 2個全局設(shè)置基類 AppGlideModule / LibraryGlideModule 開始岔留,畢竟這是全局配置的入口,先來看看2個類的定義:

public abstract class AppGlideModule extends LibraryGlideModule implements AppliesOptions {
  
  public boolean isManifestParsingEnabled() {
    return true;
  }

  @Override
  public void applyOptions(Context context, GlideBuilder builder) {
    // Default empty impl.
  }
}
public abstract class LibraryGlideModule implements RegistersComponents {

  @Override
  public void registerComponents(Context context, Glide glide, Registry registry) {
    // Default empty impl.
  }
}

可以看到 AppGlideModule 也是擴展自 LibraryGlideModule 的剪勿,LibraryGlideModule 只有一個注冊組件的方法贸诚,AppGlideModule 則實現(xiàn)了 AppliesOptions 接口,在 applyOptions 這個方法里可以進行我們對 Glide 的全局配置

看到這里各位看官是不是有疑問了厕吉,上文說到我們要把圖片加載放到單獨的基礎(chǔ)功能 module 中酱固,那么在 module 里就不能 AppGlideModule ,而只能使用 LibraryGlideModule 头朱,但是 LibraryGlideModule 不能支持我們配置全局參數(shù)啊运悲,這不就是矛盾了嘛,我做了下測試:

  • 基本設(shè)計:
    寫3個 module :app / BitmapActivity / BitmapLoader 项钮。 app 是主工程班眯;BitmapActivity 提供一個頁面希停,用來測試加載圖片;BitmapLoader 提供公共圖片加載 API 署隘,在這 module 中聲明一個 AppGlideModule 的子類出來宠能。
  • 測試流程:
    主功能有個按鈕,點擊一下跳轉(zhuǎn)到 BitmapActivity 提供的頁面去加載圖片磁餐,然后點擊一個按鈕加載圖片
  • 測試結(jié)果:
    正常沒問題违崇,可以加載出圖片來
  • 結(jié)論猜測:
    可能官方文檔的中文描述有點歧義,Glide 使用的注解在編譯時掃描指定注解的方式查找 AppGlideModule 的子類诊霹,Glide 可以做到掃描 aar 包羞延,那么這個 AppGlideModule 的子類我們寫在哪個 module 就不重要了,只要 AppGlideModule 的子類唯一脾还,注解可以掃描的到就行了伴箩,LibraryGlideModule 的意義應(yīng)該是在 module 中優(yōu)先級高于全局的 AppGlideModule 。上面這是我的猜測鄙漏。
好了啰嗦了好半天嗤谚,我們看看都有哪些可以設(shè)置的

配置入口在 AppGlideModule 的 applyOptions 方法,配置選項如下:

  • MemoryCache :內(nèi)存緩存策略
  • BitmapPool : Bitmap 池緩存策略
  • DiskCache :磁盤緩存策略
  • DefaultRequestOptions :默認請求選項
  • 未捕獲異常策略
  • LogLevel :日志級別

Glide 緩存使用LRU 算法泥张,內(nèi)存緩存使用的是 LruResourceCache 呵恢,磁盤緩存使用的是 DiskLruCacheWrapper ,位圖池使用的是 LruBitmapPool 媚创。各級緩存都可以指定大小,也可以替換成自己的實現(xiàn)彤恶,但是官方不建議這么做钞钙,可能在資源回收這里造成位置錯誤。需要說的是默認磁盤大小為 250 MB声离,具體的還是推薦大家去看官方文檔:配置 | Glide最新版V4使用指南

默認請求選項這個是比較有用的芒炼,這里我們可以設(shè)置很多東西,具體有啥后面說术徊,下面的官方文檔的例子

@GlideModule
public class YourAppGlideModule extends AppGlideModule {
  @Override
  public void applyOptions(Context context, GlideBuilder builder) {
    builder.setDefaultRequestOptions(
        new RequestOptions()
          .format(DecodeFormat.RGB_565) // 解碼格式
          .disallowHardwareBitmaps());
  }
}

要說的是 V 3.X 版本默認解碼格式是 RGB_565本刽,對于有透明通道的圖片來說可能會造成色差問題,從 V 4.X 版本開始赠涮,默認解碼格式改成了 ARGB_8888

日志這塊沒什么東西子寓,就是調(diào)整一下日志的級別罷了

@GlideModule
public class YourAppGlideModule extends AppGlideModule {
  @Override
  public void applyOptions(Context context, GlideBuilder builder) {
    builder.setLogLevel(Log.DEBUG);
  }
}

基本 api

GlideApp.with(activity)
.load(url) // 圖片地址
.override(200,200) // 設(shè)置圖片尺寸
.priority(Priority.HIGH) // 加載優(yōu)先級
.into(imageView); // 目標 view

Glide的基本使用還是很簡單的笋除,上面幾個方法都很簡單斜友,沒有復(fù)雜的參數(shù),也是一看就都懂的

占位符

這個簡單垃它,一看都懂鲜屏,不多說

  • placeholder
    加載完成之前顯示的
  • error
    請求失敗時顯示的
  • fallback
    url 為null 時顯示的烹看,但是優(yōu)先級低于 error,此時有設(shè)置了 error 就優(yōu)先顯示 error洛史,沒有時才顯示 fallback

注意有一種寫法惯殊,在請求失敗時也就是 error 時,可以再請求一次 error 的圖片也殖,注意下面的寫法:

Glide.with(fragment)
  .load(primaryUrl)
  .error(Glide.with(fragment)
      .load(fallbackUrl))
  .into(imageView);

這是 error 中需要傳入的是一個 RequestBuilder<T> 對象土思,T 的樂星跟著上面走,我們平時寫的 Glide.with(fragment).load(primaryUrl).into(imageView) 這個鏈式調(diào)用本質(zhì)就是生成一個 RequestBuilder<T> 對象毕源,所以可以作為參數(shù)傳進去浪漠。很有意思把,這樣的寫法霎褐,我也是第一次見址愿,后面還有這樣的應(yīng)用。

Thumbnail 縮略圖

有一些優(yōu)秀的后臺設(shè)計是可以讓我們再請求大圖之前給我們提供一張專屬的縮略圖冻璃,而不是大陸貨色响谓,這時 Glide 的 Thumbnail 縮略圖就發(fā)揮作用了。Glide 的 Thumbnail 縮略圖和大圖其實是2個平發(fā)的請求省艳,一般縮略圖比大圖返回的要快娘纷,所有先顯示縮略圖,但大圖的優(yōu)先級比縮略圖高跋炕,要是大圖先回來赖晶,那么就不會顯示縮略圖了》茫縮略圖我們可以配置單獨的一個 url 地址遏插,也可以用大圖的地址,指定縮略圖的尺寸或是縮放比例纠修。

 GlideApp.with(activity)
                .load(url)
                // 請求獨立的縮略圖
                .thumbnail(GlideApp.with(activity)
                        .load(thumbnailUrl))
                // 請求原圖的縮略圖胳嘲,指定大小,長寬不同
                .thumbnail(GlideApp.with(activity)
                        .load(url).override(200, 300))
                // 請求原圖的縮略圖扣草,指定大小了牛,長寬相同
                .thumbnail(GlideApp.with(activity)
                        .load(url).override( 300 ))
                // 請求原圖的縮略圖,指定大小辰妙,指定縮放比例
                .thumbnail(0.25f)

下面的 API 就要講究一個先來后到的順序問題了鹰祸,下面說2個東西,Transformation 變換上岗,transition 過度福荸。圖片加載本質(zhì)也是一個網(wǎng)絡(luò)請求,一個請求出去后肴掷,過一回就會回來敬锐,這時 Glide 的 API 會先跑 Transformation 變換的設(shè)置背传,因為這時我們拿到原始資源了,我們可以做任何我們想干的事台夺,裁剪径玖,轉(zhuǎn)換類型等。然后我們按照我們秀娥想法處理完原始資源過后就要傳遞給 view 去顯示了颤介,這時 Glide 的 API 會跑 transition 過度的設(shè)置了梳星,過度其實就是動畫,目的是為了讓 view 的圖像切換顯得不是很突兀滚朵,要貼近自然冤灾,一般都是做一個漸變動畫。

那么接下來我們按照順序辕近,先說 Transformation 變換的 API 韵吨,再來說 transition 過度的 API

Transformation 變換

Transformation 變換的目的是對原始資源進行定制化處理,我們在這里可以干一下幾種事情:

  • 類型變換移宅,默認返回的是 Drawable 類型的對象
  • 對圖片按照 imageview scaleType 進行裁剪
  • 裁剪呈圓形归粉,圓角或其他任何形狀,這是最常見的需求
  • 自定義變換
  • 沒有變換
  • 多個 Transformation 效果疊加漏峰,Transformation 默認只能用一個糠悼,想同時用多個,得打個集合包進去

類型變換 API

GlideApp.with(activity)
                .asBitmap() 
                .asDrawable()
                .asFile()
                .asGif()

不用說了吧浅乔,很直白的倔喂,你懂的,默認的是 asDrawable()

scaleType 裁剪

  GlideApp.with(activity)
                .load(url)
                .centerCrop()
                .fitCenter()
                .circleCrop()
                .dontTransform

具體效果我說一下靖苇,centerCrop 和 fitCenter 都是他們原本的效果滴劲,什么變化,circleCrop 是裁剪成圓形顾复,這里我找了下沒找到圓角的裁剪,這里系統(tǒng)自帶了圓形裁剪還是很方便的鲁捏,其他圓形裁剪后面會介紹芯砸。最后一個是沒有變化

自定義變換需要繼承 BitmapTransformation 這個類,具體的去看管飯發(fā)個文檔吧给梅,不重復(fù)寫了: Glide - 變換

多個 Transformation 效果疊加

 GlideApp.with(activity)
                .load(url)
                .transforms(new FitCenter(), new CircleCrop())

transforms 里面?zhèn)魅氲氖强勺儏?shù)假丧,可以傳入多個,說實話动羽,代碼寫到現(xiàn)在包帚,真的感覺這個可慘參數(shù)真是秒啊,要不就要多寫一個集合對象运吓,代碼上就不能像現(xiàn)在這么簡潔渴邦,流暢疯趟,舒心了。

transition 過度

承接上文谋梭,我們獲取完原始數(shù)據(jù)信峻,然后按照我們定制的處理過后,就該是我們?nèi)ト绾物@示的步奏了瓮床,目前都是采用一個漸變動畫做過度的盹舞,這個 transition 的意思就是這樣的一個動畫了。

過渡動畫執(zhí)行時機:

  • 磁盤緩存
  • 本地資源
  • 遠程資源
  • 內(nèi)存資源時不會觸發(fā)過度動畫

過渡動畫效果:

  • 淡入
  • 交叉淡入
  • 不過渡
  • V4.X 版本默認是沒有動畫效果的
// 淡入
.transition( DrawableTransitionOptions.withCrossFade() )
// 交叉淡入
.transition(DrawableTransitionOptions.withCrossFade(new DrawableCrossFadeFactory.Builder().setCrossFadeEnabled(true)))
或者
DrawableTransitionOptions options = new DrawableTransitionOptions().crossFade(new DrawableCrossFadeFactory.Builder().setCrossFadeEnabled(true));
.transition(options)
// 沒有動畫
TransitionOptions.dontTransition()
或者
.dontAnimate()

根據(jù)圖片資源類型的不同隘庄,TransitionOptions 有3種:

  • BitmapTransitionOptions
  • DrawableTransitionOptions
  • GenericTransitionOptions 通用型

動畫也可以自定義:
1.實現(xiàn)TransitionFactory
2.重寫build()
可以控制圖片在內(nèi)存緩存上是否執(zhí)行動畫踢步。

具體寫法參考DrawableCrossFadeFactory,然后調(diào)用

TransitionOptions的with(TransitionFactory transitionFactory)加載丑掺。

有一點要說啊获印,淡入的效果是給加載出來的圖片一個漸變進入的動畫,然后遮擋占位圖吼鱼。若是使用圓形變換裁剪圖片蓬豁,而使用全尺寸占位圖的話,那么圖片邊緣就會把占位圖露出來菇肃,所以占位圖的形狀一定要和圖片裁剪成的形狀相同徐熬過才好地粪。


添加監(jiān)聽器

GlideApp.with(context)
                .load(url)
                .placeholder(R.mipmap.ic_launcher)
                .error(R.mipmap.ic_launcher)
                .centerCrop()
                .listener(new RequestListener<Drawable>() {
                    @Override
                    public boolean onLoadFailed(@Nullable GlideException e, Object o, Target<Drawable> target, boolean b) {
                        Log.i(TAG, "圖片加載失敗 ");
                        return false;
                    }

                    @Override
                    public boolean onResourceReady(Drawable drawable, Object o, Target<Drawable> target, DataSource dataSource, boolean b) {
                        Log.i(TAG, "圖片加載完成: ");
                        return false;
                    }
                })
                .into(imageView);

API 是很簡單的, 但是我也沒用過啊琐谤,也許是讓我們實現(xiàn)圖片加載進度顯示的蟆技。


緩存策略

Glide 有6種緩存策略:

  • DiskCacheStrategy.AUTOMATIC
    自動緩存,默認的緩存策略斗忌,效果 = SOURCE + RESULT
  • DiskCacheStrategy.NONE
    跳過磁盤緩存
  • DiskCacheStrategy.SOURCE
    僅僅只緩存原來的全分辨率的圖像质礼,改變尺寸或是變換過后的都不緩存
  • DiskCacheStrategy.RESULT
    僅僅緩存最終的圖像,即织阳,降低分辨率后的(或者是轉(zhuǎn)換后的)
  • DiskCacheStrategy.ALL
    緩存所有版本的圖像(默認行為)
  • skipMemoryCache(true)
    跳過內(nèi)存緩存眶蕉, 加載的圖片不存入內(nèi)存中,也不從內(nèi)存中查詢緩存

對于我們經(jīng)常要進行變換的圖片來說唧躲,變換過后的圖片可能對你有很打的影響造挽,那么忽略內(nèi)存緩存是很有必要的,以此類推弄痹,這幾種緩存策略還是不難理解的饭入,大部分情況下默認緩存模式就夠我們用了。但是要注意默認緩存模式中肛真,磁盤緩存和內(nèi)存緩存是一樣的谐丢,內(nèi)存緩存了什么都會同步到磁盤緩存中,比如變換的圖片也會進行磁盤緩存。


統(tǒng)一參數(shù)配置

還記得 AppGlideModule 這個類吧乾忱,我們可以在這個類的子類中進行統(tǒng)一配置讥珍,可以配置的屬性如下:

  • Placeholders 占位符
  • Transformations 變換
  • Caching Strategies 緩存策略
  • 組件特定參數(shù):編碼質(zhì)量,解碼參數(shù)等饭耳。
@GlideModule
public class MyLibraryGlideModule extends AppGlideModule {

    @Override
    public void applyOptions(Context context, GlideBuilder builder) {
        super.applyOptions(context, builder);

        RequestOptions requestOptions = new RequestOptions();
        requestOptions.placeholder(R.drawable.ic_launcher_xx)
                // 占位符
                .error(R.drawable.ic_launcher_xx)
                .format(DecodeFormat.PREFER_ARGB_8888)
                // transform 變換串述,裁剪等
                .circleCrop();

        // 過度動畫參數(shù)
        DrawableTransitionOptions transitionOptions =            DrawableTransitionOptions.withCrossFade(new DrawableCrossFadeFactory.Builder().setCrossFadeEnabled(true));

        builder.setDefaultRequestOptions(requestOptions);
        builder.setDefaultTransitionOptions(Drawable.class, transitionOptions);
    }
}

資源清理

Glide 的資源清理要小心,所有的在 Glide 相關(guān) API 中獲取的 Drawable寞肖,Bitmap 都是由 Glide 統(tǒng)一負責(zé)回收纲酗,重用,所以我們不能私自進行 recycle 等回收操作新蟆,有可能會引起錯誤觅赊。

但是我們還是可以進行資源回收操作的,有3個操作:

  • clean
    清除正在顯示的 view 和圖片資源的關(guān)聯(lián)琼稻,注意這時 view 會返回顯示占位圖或是空白圖片
GlideApp.with(activity).clear(image);
  • clearMemory
    清除內(nèi)存緩存吮螺,官方不建議我們這么做,但是自行判斷下在用喲見大量圖片的頁面關(guān)閉時帕翻,要不要手動回收下內(nèi)存資源鸠补,我覺得這樣還是有必要的。Glide 在頁面關(guān)閉時做的也只是停止這個頁面當(dāng)前的所有請求嘀掸。這個方法是同步方法紫岩,在主線程運行
GlideApp.get(activity).clearMemory();
  • clearDiskCache
    清楚磁盤緩存,這個我覺得意義不大睬塌, 默認的磁盤緩存是 250M 大小泉蝌,而且磁盤會緩存圖片的原始數(shù)據(jù),變換揩晴,裁剪過后的數(shù)據(jù)都會緩存勋陪,這樣其實是很方便我們的,一般情況下我們是不會觸發(fā)這個選項的硫兰,除了有一些 app 在設(shè)置里可以清楚緩存诅愚。這個方法注意是需要異步運行的
AsyncTask<Void, Void, Void> task = new AsyncTask<Void, Void, Void>() {
            @Override
            protected Void doInBackground(Void... voids) {
                GlideApp.get(activity).clearDiskCache();
                return null;
            }
        };
        task.execute();
    }

參考資料:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市劫映,隨后出現(xiàn)的幾起案子呻粹,更是在濱河造成了極大的恐慌,老刑警劉巖苏研,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異腮郊,居然都是意外死亡摹蘑,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進店門轧飞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來衅鹿,“玉大人撒踪,你說我怎么就攤上這事〈蟛常” “怎么了制妄?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長泵三。 經(jīng)常有香客問我耕捞,道長,這世上最難降的妖魔是什么烫幕? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任俺抽,我火速辦了婚禮,結(jié)果婚禮上较曼,老公的妹妹穿的比我還像新娘磷斧。我一直安慰自己,他們只是感情好捷犹,可當(dāng)我...
    茶點故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布弛饭。 她就那樣靜靜地躺著,像睡著了一般萍歉。 火紅的嫁衣襯著肌膚如雪侣颂。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天翠桦,我揣著相機與錄音横蜒,去河邊找鬼。 笑死销凑,一個胖子當(dāng)著我的面吹牛丛晌,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播斗幼,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼澎蛛,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蜕窿?” 一聲冷哼從身側(cè)響起谋逻,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎桐经,沒想到半個月后毁兆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡阴挣,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年气堕,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡茎芭,死狀恐怖揖膜,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情梅桩,我是刑警寧澤壹粟,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站宿百,受9級特大地震影響趁仙,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜犀呼,卻給世界環(huán)境...
    茶點故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一幸撕、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧外臂,春花似錦坐儿、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至罪佳,卻和暖如春逛漫,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背赘艳。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工酌毡, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蕾管。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓枷踏,卻偏偏與公主長得像,于是被迫代替她去往敵國和親掰曾。 傳聞我的和親對象是個殘疾皇子旭蠕,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,976評論 2 355