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.