Glide開源庫的使用
關於Glide
Glide是一款快速高效的Android影象載入庫,注重於平滑的滾動。Glide提供了易用的API,高效能、可擴充套件的圖片解碼管道(decode pipeline),以及自動的資源池技術。
Glide 支援拉取,解碼和展示視訊快照,圖片,和GIF動畫。
Glide預設使用的是HttpUrlConnection類下載圖片,但是也提供了與Google Volley和Square OkHttp快速整合的工具庫。
雖然Glide 的主要目標是讓任何形式的圖片列表的滾動儘可能地變得更快、更平滑,但實際上,Glide幾乎能滿足你對遠端圖片的拉取/縮放/顯示的一切需求。
Android SDK 要求
- 使用 Glide 最小SDK版本(minSdkVersion)必須是API 14 (Ice Cream Sandwich) 或更高。
- 使用Glide 編譯SDK版本(compileSdkVersion)必須是 API 27 (Oreo MR1) 或更高版本
Android Studio線上依賴
Glide支援線上依賴,目前最新版本是4.8.0,在build.gradle檔案中dependencies屬性下增加兩行程式碼。
dependencies { compile 'com.github.bumptech.glide:glide:4.8.0' annotationProcessor 'com.github.bumptech.glide:compiler:4.8.0' }
許可權
Glide一般情況下需要向AndroidManifest.xml檔案中新增以下四個許可權:
<uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
- INTERNET:訪問網路許可權,有了這個許可權才能從網路上線上載入圖片。
- ACCESS_NETWORK_STATE:訪問網路狀態許可權,不是必須的許可權,但是加上可以處理片狀網路(flaky network) 和飛航模式。
- READ_EXTERNAL_STORAGE:閱讀本地SD卡許可權,從本地資料夾或 DCIM 或相簿中載入圖片。
- WRITE_EXTERNAL_STORAGE:將Glide的快取儲存到SD卡上需要這個許可權。
簡單使用
Glide載入圖片非常簡單,只需要一行程式碼:
Glide.with(this) .load("https://github.com/ansen666/images/blob/master/" + "public/qrcode_for_gh_14a89f21bd5e_258.jpg?raw=true") .into(imageView);
上面這行程式碼先後呼叫了三個方法:
- with 傳入Activity或者Fragment例項,這裡我們直接用this
- load 圖片url
- into 圖片載入完成之後顯示在這個控制元件上
當然我們還可以取消載入,但是一般情況不需要使用,因為Glide.with()方法中傳入的Activity或者Fragment例項銷燬時,Glide 會自動取消載入並回收資源。
後臺執行緒
其實Glide是可以通過後臺執行緒獲取Bitmap的,在後臺執行緒中直接使用submit(int, int)方法。
new Thread(runnable).start(); //在後臺執行緒中獲取bitmap Runnable runnable=new Runnable() { @Override public void run() { FutureTarget<Bitmap> futureTarget = Glide.with(MainActivity.this) .asBitmap() .load("https://github.com/ansen666/images/blob/master/" + "public/qrcode_for_gh_14a89f21bd5e_258.jpg?raw=true") .submit(); try { Bitmap bitmap = futureTarget.get(); Log.i("ansen","獲取的bitmap:"+bitmap); //當上面獲取的bitmap使用完畢時,呼叫clear方法釋放資源 Glide.with(MainActivity.this).clear(futureTarget); } catch (ExecutionException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } } };
首先新建一個執行緒,跟前面的載入圖片不同的是我們呼叫了submit方法,這個方法可以傳入一個寬高也可以不傳,同時返回FutureTarget物件,在呼叫get方法獲取我們需要的Bitmap,當我們獲取的bitmap使用完畢時,記得呼叫clear方法釋放資源。
futureTarget.get方法會丟擲異常,需要用try catch捕捉。
當然,如果你不想開一個執行緒獲取Bitmap也是可以的,可以通過主執行緒非同步獲取Bitmap方式。
Glide.with(this) .asBitmap() .load("https://github.com/ansen666/images/blob/master/" + "public/qrcode_for_gh_14a89f21bd5e_258.jpg?raw=true") .into(new SimpleTarget<Bitmap>() { @Override public void onResourceReady(Bitmap resource, Transition<? super Bitmap> transition) { //這裡我們拿到回掉回來的bitmap,可以載入到我們想使用到的地方 imageView.setImageBitmap(resource); } @Override public void onLoadFailed(@Nullable Drawable errorDrawable) { super.onLoadFailed(errorDrawable); Log.i("ansen", "圖片載入失敗"); } });
從上述程式碼中可以看到,into方法傳入的是一個SimpleTarget物件,這個類是一個抽象類,這裡我們使用內部類方式實現,重寫這個類的兩個方法(onResourceReady和onLoadFailed),onResourceReady載入圖片成功會回撥,同時把Bitmap當引數返回。onLoadFailed方法載入圖片失敗回撥。
load方法傳入其他引數
如果你以為Glide只能載入網路圖片的話,那就不會有這麼多人使用了,他還能支援Resources資源、File資源、Uri資源、位元組陣列等方式載入。
Glide.with(context).load(resourceId).into(imageView); Glide.with(context).load(file).into(imageView); Glide.with(context).load(uri).into(imageView); Glide.with(context).load(byte[]).into(imageView);
載入gif圖片
Glide支援直接載入Gif圖片,使用也很簡單,就多呼叫一個asGif方法而已
Glide.with(this).asGif().load(R.mipmap.result).into(ivGif);
Generated API
Glide v4 使用 註解處理器 (Annotation Processor) 來生成出一個 API,在 Application 模組中可使用該流式 API 一次性呼叫到 RequestBuilder, RequestOptions 和整合庫中所有的選項。
Generated API 模式的設計出於以下兩個目的:
- 整合庫可以為 Generated API 擴充套件自定義選項。
- 在 Application 模組中可將常用的選項組打包成一個選項在 Generated API 中使用
開始使用
Generated API 目前僅可以在 Application 模組內使用。這一限制可以讓我們僅持有一份 Generated API,而不是各個 Library 和 Application 中均有自己定義出來的 Generated API。
這一做法會讓 Generated API 的呼叫更簡單,並確保 Application 模組中 Generated API 呼叫的選項在各處行為一致。這一限制在接下來的版本中也許會被取消(以實驗性或其他的方式給出)。
在app模組中使用Generated API,需要兩個步驟:
1.新增 Glide 註解處理器的依賴
dependencies { annotationProcessor 'com.github.bumptech.glide:compiler:4.8.0' }
我們文章開頭講解Android Studio線上依賴的時候就有包含這個,所以這個步驟可以忽略。
在 Application 模組中包含一個 AppGlideModule 的實現
我們新建一個類,類名叫MyAppGlideModule,名字可以隨便起,但是必須要繼承自AppGlideModule,以及給類加上@GlideModule註解標記。
import com.bumptech.glide.annotation.GlideModule; import com.bumptech.glide.module.AppGlideModule; /** * @author ansen * @create time 2018/10/28 */ @GlideModule public final class MyAppGlideModule extends AppGlideModule { }
Android Studio 在大多數時候都可以正確地處理註解處理器 (annotation processor) 和 generated API。然而,當你第一次新增 AppGlideModule 時,需要重新 (rebuild) 一下專案。不然使用GlideApp類時會提示找不到這個類。
使用Generated API
Generated API 預設名為 GlideApp ,使用起來跟之前Glide方式一樣,只需要把Glide替換成GlideApp,例如載入線上圖片顯示,程式碼如下:
//Generated API 使用方式 GlideApp.with(this) .load("https://github.com/ansen666/images/blob/master/" + "public/qrcode_for_gh_14a89f21bd5e_258.jpg?raw=true") .into(imageView);
與 Glide.with() 不同,諸如 fitCenter() 和 placeholder() 等選項在 Builder 中直接可用,並不需要再傳入單獨的 RequestOptions 物件。
說點廢話
今天Glide就給大家介紹到這裡了,接下來我還會講解Glide佔位符、動畫、Target、配置、快取、整合Okhttp等一系列文章,希望大家持續關注,新的一個禮拜又開始了,祝大家工作愉快。
原始碼下載:
https://github.com/ansen666/GlideTest
如果你想第一時間看我的後期文章,掃碼關注公眾號,長期推送Android開發文章、最新動態、開源專案,讓你各種漲姿勢。
Android開發666 - 安卓開發技術分享 掃描二維碼加關注