Glide 4概述
有些朋友覺得Glide 4相對于Glide 3改動非常大,其實不然;之所以大家會有這種錯覺,是因為你將Glide 3的用法直接搬到Glide 4中去使用,結果IDE全面報錯,然后大家可能就覺得Glide 4的用法完全變掉了。其實Glide 4相對于Glide 3的變動并不大,只是你還沒有了解它的變動規則而已。
一旦你掌握了Glide 4的變動規則之后,你會發現大多數Glide 3的用法放到Glide 4上都還是通用的。其實研究之后,發現Glide 4并不能算是有什么突破性的升級,而更多是一些API工整方面的優化;相比于Glide 3的API,Glide 4進行了更加科學合理地調整,使得易讀性、易寫性、可擴展性等方面都有了不錯的提升。
好了,對Glide 4進行一個基本的概述之后,接下來我們就要正式開始學習它的用法了。
要想使用Glide,首先需要將這個庫引入到我們的項目當中。新建一個Glide4Test項目,然后在app/build.gradle文件當中添加如下依賴:
1. implementation 'com.github.bumptech.glide:glide:4.8.0'
2. annotationProcessor 'com.github.bumptech.glide:compiler:4.8.0'
注意,相比于Glide 3,這里要多添加一個compiler的庫,這個庫是用于生成Generated API的,不適用可不添加。另外,Glide中需要用到網絡功能,因此你還得在AndroidManifest.xml中聲明一下網絡權限才行:
<uses-permission android:name="android.permission.INTERNET" />
就是這么簡單,然后我們就可以自由地使用Glide中的任意功能了。
加載圖片
Glide.with(this).load(url).into(imageView);
占位圖
RequestOptions options = new RequestOptions()
.placeholder(R.drawable.loading);
Glide.with(this)
.load(url)
.apply(options)
.into(imageView);
沒錯,4.X的版本API發生改變,沒辦法直接像3.X那樣添加占位圖
(Glide.with(this).load(url).placeholder(R.drawable.loading).into(imageView);)
這里我們先創建了一個RequestOptions對象,然后調用它的placeholder()方法來指定占位圖,再將占位圖片的資源id傳入到這個方法中。最后,在Glide的三步走之間加入一個apply()方法,來應用我們剛才創建的RequestOptions對象。
異常占位圖的用法相信你已經可以猜到了,首先準備一張error.jpg圖片,然后修改Glide加載部分的代碼,如下所示:
RequestOptions options = new RequestOptions()
.placeholder(R.drawable.ic_launcher_background)
.error(R.drawable.error)
.diskCacheStrategy(DiskCacheStrategy.NONE);
Glide.with(this)
.load(url)
.apply(options)
.into(imageView
這樣的話,Glide就不會再去自動壓縮圖片,而是會去加載圖片的原始尺寸。當然,這種寫法也會面臨著更高的OOM風險。
緩存機制
Glide的緩存設計可以說是非常先進的,考慮的場景也很周全。在緩存這一功能上,Glide又將它分成了兩個模塊,一個是內存緩存,一個是硬盤緩存。
這兩個緩存模塊的作用各不相同:
內存緩存的主要作用是防止應用重復將圖片數據讀取到內存當中,
硬盤緩存主要作用是防止應用重復從網絡或其他地方重復下載和讀取數據。
內存緩存和硬盤緩存的相互結合才構成了Glide極佳的圖片緩存效果,那么接下來我們就來分別學習一下這兩種緩存的使用方法。
內存緩存
你要知道,默認情況下,Glide自動就是開啟內存緩存的。也就是說,當我們使用Glide加載了一張圖片之后,這張圖片就會被緩存到內存當中,只要在它還沒從內存中被清除之前,下次使用Glide再加載這張圖片都會直接從內存當中讀取,而不用重新從網絡或硬盤上讀取了,這樣無疑就可以大幅度提升圖片的加載效率。比方說你在一個RecyclerView當中反復上下滑動,RecyclerView中只要是Glide加載過的圖片都可以直接從內存當中迅速讀取并展示出來,從而大大提升了用戶體驗.
Glide默認就已經將它開啟,還有什么可講的用法呢?只有一點,如果你有什么特殊的原因需要禁用內存緩存功能,Glide對此提供了接口:
RequestOptions options = new RequestOptions()
.skipMemoryCache(true);
Glide.with(this)
.load(url)
.apply(options)
.into(imageView);
可以看到,只需要調用skipMemoryCache()方法并傳入true,就表示禁用掉Glide的內存緩存功能。
硬盤緩存
RequestOptions options = new RequestOptions()
.diskCacheStrategy(DiskCacheStrategy.NONE);
Glide.with(this)
.load(url)
.apply(options)
.into(imageView);
調用diskCacheStrategy()方法并傳入DiskCacheStrategy.NONE,就可以禁用掉Glide的硬盤緩存功能了。
這個diskCacheStrategy()方法基本上就是Glide硬盤緩存功能的一切,它可以接收五種參數:
DiskCacheStrategy.NONE: 表示不緩存任何內容。
DiskCacheStrategy.DATA: 表示只緩存原始圖片。
DiskCacheStrategy.RESOURCE: 表示只緩存轉換過后的圖片。
DiskCacheStrategy.ALL : 表示既緩存原始圖片,也緩存轉換過后的圖片。
DiskCacheStrategy.AUTOMATIC: 表示讓Glide根據圖片資源智能地選擇使用哪一種緩存策略(默認選項)。
其中,DiskCacheStrategy.DATA對應Glide 3中的DiskCacheStrategy.SOURCE,DiskCacheStrategy.RESOURCE對應Glide 3中的DiskCacheStrategy.RESULT。而DiskCacheStrategy.AUTOMATIC是Glide 4中新增的一種緩存策略,并且在不指定diskCacheStrategy的情況下默認使用就是的這種緩存策略。