Glide V4 框架新特性(Migrating from v3 to v4)
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中,配置工作是類似的,但稍微更復雜的系統配置。
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;
}
...
}
資源參考: