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 - 安卓開發技術分享
             掃描二維碼加關注

Android開發666

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章