Glide V4 框架新特性(Migrating from v3 to v4)

新根發表於2017-05-20

Android Glide4 非同步圖片框架


不瞭解官方推舉使用Glide框架,可以先閱讀Glide框架介紹.

Glide v4版本前幾天新發布,一些新特性也需要學習下。

從V3到V4遷移,改變的行為和配置如下:

  • Options
    • RequestBuilder
    • RequestOptions
    • TransitionOptions
    • Generated API
  • Types and Targets
    • Picking Resource Types
    • Drawables
    • Targets
      • Cancellation
  • Configuration
    • Applications
    • Libraries
    • Manifest parsing

Options:


在Glide v3中,options是由一系列複雜的多個builder來處理。

在Glide v4中,處理options(centerCrop(),placeholder()等 )方式發生了改變。處理Options的方式將由單一型別的Builder和一系列提供Buidler的options物件所取代。 Glide`s generated API進一步簡化,通過合併多個options和來源inegration libraries使用的Builder去建立單個流暢的API.

RequestBuilder:

API方法:

  • listener()
  • thumbnail()
  • load()
  • into()

在Glide v4中,從幾種型別(Bitmap,Drawable,GifDrawable等)中,選取一個來建立指定型別的RequestBuilder。RequstBuilder物件能控制自身的Options,包括Model(url,uri等等),thumbnail,lisRequestlistener。ReuqstBuilder的開啟使用通過into()或者preload()

使用案例如下:

RequestBuilder<Drawable> requestBuilder = Glide.with(fragment)
    .load(url);

requestBuilder
    .thumbnail(  Glide.with(fragment)
            .load(thumbnailUrl) )
    .listener(requestListener)
    .load(url)
    .into(imageView);

RequestOptions

API方法:

  • centerCrop()
  • placeholder()
  • error()
  • priority()
  • diskCacheStrategy()

在v3中,大多數的options操作移到RequestOptions中。

一個包含一些列options的RequstOptions能夠被多個RequstBuilder所運用。

使用案例如下:

RequestOptions myOptions = new RequestOptions()
    .fitCenter()
    .placeholder(R.drawable.placeholder)
    .error(R.drawable.error)
    .override(100, 100);

Glide.with(fragment)
    .load(url)
    .apply(myOptions)
    .into(drawableView);

Glide.with(fragment)
    .asBitmap()
    .apply(myOptions)
    .load(url)
    .into(bitmapView);

TransitionOptions

API方法:

  • crossFade()
  • animate()

TransitionOptions是用於控制佔點陣圖片或者thumbnails圖片切換到真正需要載入的圖片之間的過度。

TransitionOptions包含三個子類:

  • GenericTransitionOptions
  • DrawableTransitionOptions
  • BitmapTransitionOptions

移除預設的transition,使用TransitionOptions.dontTransition()

使用案例:

Glide.with(fragment)
    .load(url)
    .transition(withCrossFade(R.anim.fade_in, 300));

Generated API

為了更好的使用Glide v4 , Glide為運用程式提供了一個generated API. 運用程式中應該建立一個帶有@GlideModule註解的AppGlideModule子類,來使用generated API。更多閒情,閱讀Generated API介紹.

Generated API新增一個GlideApp類,該類能夠提供對RequestBuilder和RequestOptions子類的訪問。RequestOptions子類包含RequestOptions包含的全部方法和GlideExtensions定義的方法。RequestBuilder子類不需要使用apply方法,來訪問RequestBuilder子類中全部方法。

注意點:使用GlideApp,需要新增annotationProcessor 的依賴:來源

   annotationProcessor 'com.github.bumptech.glide:compiler:4.0.0-RC0'

使用Generated AP,一個RequestOptions被內嵌呼叫:

GlideApp.with(fragment)
    .load(url)
    .centerCrop()
    .placeholder(R.drawable.placeholder)
    .error(R.drawable.error)
    .priority(Priority.HIGH)
    .into(imageView);

不使用Generated API的方式案例:

Glide.with(fragment)
    .load(url)
    .apply(centerCropTransform()
        .placeholder(R.drawable.placeholder)
        .error(R.drawable.error)
        .priority(Priority.HIGH))
    .into(imageView);

Types and Targets


Picking Resource Types

在使用Glide時,可以指定你想載入的資源型別。倘若你指定了一個超類的型別,Glide將嘗試載入一個可用的子類型別。例如,指定載入型別是Drawable,Glide會載入BitmapDrawable或者GifDrawable。

Glide預設的請求是Drawable型別的:

Glide.with(fragment).load(url)

指定Bitmap型別:

Glide.with(fragment).asBitmap()

指定檔案路徑(最適合本地圖片):

Glide.with(fragment).asFile()

去下載一個遠端的檔案寫入快取中,且獲得一個檔案路徑:

Glide.with(fragment).downloadOnly()

//或者你已經有一個Url。
Glide.with(fragmetn).download(url);

Drawables

在Glide v3中GlideDrwable已經被移除,有利於anroid標準的Drawable。GlideBitmapDrawable也已經被移除,有利於BitmapDrawable。

判斷一個Drawable是否是動畫的,通過Animatable可以判斷:

boolean isAnimated = drawable instanceof Animatable

Targets

onResourceReady()的引數發生了改變

//原來的
onResourceReady(GlideDrawable drawable, GlideAnimation<? super GlideDrawable> anim)

//現在改成以下形式:
onResourceReady(Drawable drawable, Transition<? super Drawable> transition);

onLondFailed的簽名也改變了:

//原來的
onLoadFailed(Exception e, Drawable errorDrawable)

//現在的
onLoadFailed(Drawable errorDrawable)

使用RquestListener可以知道,在載入過程中失敗的資訊。

Cancellation

原本的Glide.with(Target)移到RequestManager中,使用方式如下:

Glide.with(fragment).clear(target)

清除不是必須要求的,但是使用RequestManger開啟載入,和清除載入,效果會更好。Glide v4跟蹤每個Activity和Fragment的請求,因此需要適當的生命週期去清除這些請求。

Configuration


在Glide v3中,使用一個或者多個GlideModules來執行配置。在Glide v4中,配置工作是類似的,但稍微更復雜的系統配置。

更多新配置,請閱讀Configuration頁面

Applications

在Glide v4中,轉換和進入AppGlideModule:

@GlideModule
public class GiphyGlideModule extends AppGlideModule {
  @Override
  public void applyOptions(Context context, GlideBuilder builder) {
    builder.setMemoryCache(new LruResourceCache(10 * 1024 * 1024));
  }

  @Override
  public void registerComponents(Context context, Registry registry) {
    registry.append(Api.GifResult.class, InputStream.class, new GiphyModelLoader.Factory());
  }
}

需注意:@GlideModule註解是必需的。

若是運用程式中具備多個GlideModules,將其中一個轉成AppGlideModule,其他的轉成LibraryGlideModules。倘若,存在AppGlideModule的時候,才會發現LibraryGlideModule。因此,不能僅適用LibraryGlideModules。

Libraries

擁有一個或者多個的GlideModule的庫應該使用LibraryGlideModule而不是AppGlideModule。庫不應是使用AppGlideModules,因為每個運用程式只有一個AppGliModules。因此,包含在唯一一個庫的AppGlideModules,不會阻止庫去設定庫本身的options。多個庫包含一個AppGlideMoudle,它會導致衝突。

在V4 中,Volley GlideModule的轉換:

@GlideModule
public class VolleyLibraryGlideModule extends LibraryGlideModule {
  @Override
  public void registerComponents(Context context, Registry registry) {
    registry.replace(GlideUrl.class, InputStream.class, new VolleyUrlLoader.Factory(context));
  }
}

Manifest parsing

為了簡化遷移,清單解析和舊的GlideModule介面已經被棄用,但是在V4中任然支援。AppGlideModules, LibraryGlideModules 和 棄用的 GlideModules已舊可以在程式中共存。

但是,為了避免檢查後設資料(和相關的錯誤)帶來的效能開銷。可以通過覆蓋AppGlideModule中的isManifestParsingEnabled()來,控制是否解析清單。

@GlideModule
public class GiphyGlideModule extends AppGlideModule {
  @Override
  public boolean isManifestParsingEnabled() {
    return false;
  }

  ...
}

資源參考

相關文章