為了Glide的配置可以正常的工作,庫(kù)跟應(yīng)用程序需要執(zhí)行一序列的步驟。請(qǐng)注意,庫(kù)不希望注冊(cè)不需要的附加的組件。
庫(kù)必須:
一個(gè)使用OkHttp集成庫(kù)的Glide例子如下所示:
@GlideModule
public final class OkHttpLibraryGlideModule extends LibraryGlideModule {
@Override
public void registerComponents(Context context, Registry registry) {
registry.replace(GlideUrl.class, InputStream.class, new OkHttpUrlLoader.Factory());
}
}
使用@GlideModule注解需要Glide注解依賴(lài)庫(kù):
compile 'com.github.bumptech.glide:annotations:4.0.0-RC1'
應(yīng)用程序必須:
在Glide的Flickr sample app的一個(gè)AppGlideModule例子:
@GlideModule
public class FlickrGlideModule extends AppGlideModule {
@Override
public void registerComponents(Context context, Registry registry) {
registry.append(Photo.class, InputStream.class, new FlickrModelLoader.Factory());
}
}
包含Glide注解處理器要求Glide注解依賴(lài)和注解處理器:
compile 'com.github.bumptech.glide:annotations:4.0.0-RC1'
annotationProcessor 'com.github.bumptech.glide:compiler:4.0.0-RC1'
最后,您應(yīng)該在proguard.cfg保持AppGlideModule實(shí)現(xiàn):
-keep public class * extends com.bumptech.glide.module.AppGlideModule
-keep class com.bumptech.glide.GeneratedAppGlideModuleImpl
Glide允許應(yīng)用程序使用AppGlideModule實(shí)現(xiàn)完全控制Glide的內(nèi)存跟磁盤(pán)緩存用法。Glide嘗試給大多數(shù)應(yīng)用程序提供合理的默認(rèn)值,但是對(duì)于某些應(yīng)用程序,需要自定義這些值。一定要衡量避免任何性能下降的修改。
默認(rèn)情況下,Glide使用LruResourceCache,一個(gè)內(nèi)存緩存接口的默認(rèn)實(shí)現(xiàn)使用固定的內(nèi)存和LRU算法。LruResourceCache的大小由Glide的MemorySizeCalculator類(lèi)決定,它可以查看設(shè)備內(nèi)存是否不足以及屏幕的分辨率。
應(yīng)用程序可以在AppGlideModule類(lèi)的applyOptions(Context, GlideBuilder)方法中配置MemorySizeCalculator定制化內(nèi)存緩存的大小。
@GlideModule
public class YourAppGlideModule extends AppGlideModule {
@Override
public void applyOptions(Context context, GlideBuilder builder) {
MemorySizeCalculator calculator = new MemorySizeCalculator.Builder(context)
.setMemoryCacheScreens(2)
.build();
builder.setMemoryCache(new LruResourceCache(calculator.getMemoryCacheSize()));
}
}
應(yīng)用程序可以直接覆蓋緩存大小:
@GlideModule
public class YourAppGlideModule extends AppGlideModule {
@Override
public void applyOptions(Context context, GlideBuilder builder) {
int memoryCacheSizeBytes = 1024 * 1024 * 20; // 20mb
builder.setMemoryCache(new LruResourceCache(memoryCacheSizeBytes));
}
}
應(yīng)用程序可以提供他們自己的內(nèi)存緩存實(shí)現(xiàn)類(lèi):
@GlideModule
public class YourAppGlideModule extends AppGlideModule {
@Override
public void applyOptions(Context context, GlideBuilder builder) {
builder.setMemoryCache(new YourAppMemoryCacheImpl());
}
}
Glide使用DiskLruCacheWrapper作為默認(rèn)的磁盤(pán)緩存。DiskLruCacheWrapper是使用LRU算法的固定的磁盤(pán)緩存大小。默認(rèn)的磁盤(pán)緩存大小是250MB并且在程序緩存文件夾的特定的目錄。
如果顯示的媒體文件是公開(kāi)的,應(yīng)用可以將位置改變?yōu)橥獠看鎯?chǔ)(包括沒(méi)有認(rèn)證的網(wǎng)站,搜索引擎等等):
@GlideModule
public class YourAppGlideModule extends AppGlideModule {
@Override
public void applyOptions(Context context, GlideBuilder builder) {
builder.setDiskCache(new ExternalDiskCacheFactory(context));
}
}
應(yīng)用程序可以改變磁盤(pán)緩存大小,不管是內(nèi)部的還是外部的:
@GlideModule
public class YourAppGlideModule extends AppGlideModule {
@Override
public void applyOptions(Context context, GlideBuilder builder) {
int diskCacheSizeBytes = 1024 * 1024 * 100; // 100 MB
builder.setDiskCache(new InternalDiskCacheFactory(context, diskCacheSizeBytes));
}
}
應(yīng)用程序可以改變外部存儲(chǔ)或者內(nèi)部存儲(chǔ)的緩存文件夾的名字:
@GlideModule
public class YourAppGlideModule extends AppGlideModule {
@Override
public void applyOptions(Context context, GlideBuilder builder) {
int diskCacheSizeBytes = 1024 * 1024 * 100; // 100 MB
builder.setDiskCache(
new InternalDiskCacheFactory(context, "cacheFolderName", diskCacheSizeBytes));
}
}
應(yīng)用程序可以選擇實(shí)現(xiàn)DiskCache接口并提供他們自己的DiskCache.Factory實(shí)例。Glide使用工廠接口在后臺(tái)線程開(kāi)啟磁盤(pán)緩存。緩存可以做I/O操作。例如:檢查目標(biāo)目錄的存在沒(méi)有違反在嚴(yán)格模式。
@GlideModule
public class YourAppGlideModule extends AppGlideModule {
@Override
public void applyOptions(Context context, GlideBuilder builder) {
builder.setDiskCache(new DiskCache.Factory() {
@Override
public DiskCache build() {
return new YourAppCustomDiskCache();
}
});
}
}
應(yīng)用程序和庫(kù)都可以注冊(cè)一些繼承Glide方法的組件,可用的組件包括:
注冊(cè)組件使用Registry類(lèi)。比如:添加ModelLoader可以為自定義模型對(duì)象獲得一個(gè)輸入流。
@GlideModule
public class YourAppGlideModule extends AppGlideModule {
@Override
public void registerComponents(Context context, Registry registry) {
registry.append(Photo.class, InputStream.class, new CustomModelLoader.Factory());
}
}
任意數(shù)量的組件可以注冊(cè)在單一的GlideModule。ModelLoader和ResourceDecoder可以有多個(gè)相同類(lèi)型參數(shù)的實(shí)現(xiàn)類(lèi)。
注冊(cè)的組件列表,包括那些Glide默認(rèn)注冊(cè)的和那些在模型中注冊(cè)的定義的負(fù)載路徑。每個(gè)附件路徑是一步步模型提供的負(fù)載資源類(lèi)型通過(guò)as()指定的類(lèi)型。負(fù)載路徑粗略符合下一步驟:
Encoder第一步時(shí),寫(xiě)入數(shù)據(jù)到Glide磁盤(pán)緩存。ResourceEncoder在第二步時(shí),寫(xiě)資源到Glide磁盤(pán)緩存。
當(dāng)一個(gè)請(qǐng)求開(kāi)啟時(shí),Glide將嘗試從模型到請(qǐng)求資源的所有可用的路徑。只要有任何一個(gè)負(fù)載路徑成功則請(qǐng)求成功。只有所有負(fù)載路徑都失敗請(qǐng)求才失敗。
注冊(cè)表中的prepend(),append()和replace()方法可用于設(shè)置Glide將嘗試每個(gè)ModelLoader和ResourceDecoder的順序。通過(guò)確保首先注冊(cè)處理最常見(jiàn)類(lèi)型的ModelLoaders和ResourceDecoders,可以使請(qǐng)求更高效。組件排序還可以允許您注冊(cè)處理模型或數(shù)據(jù)的特定子集的組件(即只有某些類(lèi)型的Uris或僅某些圖像格式),同時(shí)還具有附加的全部組件來(lái)處理其余部分。
Glide v4依賴(lài)于兩個(gè)類(lèi)AppGlideModule和LibraryGlideModule來(lái)配置Glide單例。允許這兩個(gè)類(lèi)注冊(cè)其他組件,如:ModelLoaders,ResourceDecoders等。只有AppGlideModules允許配置應(yīng)用程序特定的設(shè)置,如緩存實(shí)現(xiàn)和大小。
所有應(yīng)用程序必須添加AppGlideModule實(shí)現(xiàn),即使應(yīng)用程序沒(méi)有更改任何其他設(shè)置或在AppGlideModule中實(shí)現(xiàn)任何方法。 AppGlideModule實(shí)現(xiàn)作為一個(gè)信號(hào),允許Glide的注解處理器與所有找到的LibraryGlideModules一起生成單個(gè)組合類(lèi)。
在給定的應(yīng)用程序中只能有一個(gè)AppGlideModule實(shí)現(xiàn)(在編譯時(shí)有多個(gè)產(chǎn)生錯(cuò)誤)。因此,庫(kù)絕不能提供AppGlideModule實(shí)現(xiàn)。
為了讓Glide正確找到AppGlideModule和LibraryGlideModule實(shí)現(xiàn),這兩個(gè)類(lèi)的所有實(shí)現(xiàn)都必須用@GlideModule注解。注解將允許Glide的注解處理器在編譯時(shí)發(fā)現(xiàn)所有實(shí)現(xiàn)。
此外,為了找到AppGlideModule和LibraryGlideModules,所有的庫(kù)和應(yīng)用程序還必須包含對(duì)Glide的注解處理器的依賴(lài)。
應(yīng)用程序可能依賴(lài)于多個(gè)庫(kù),每個(gè)庫(kù)可能包含一個(gè)或多個(gè)LibraryGlideModules。在極少數(shù)情況下,這些LibraryGlideModule可能定義了沖突的選項(xiàng),或者包括應(yīng)用程序希望避免的行為。應(yīng)用程序可以通過(guò)將@Excludes注解添加到其AppGlideModule來(lái)解決這些沖突或避免不必要的依賴(lài)關(guān)系。
例如,如果您依賴(lài)于您想要避免的LibraryGlideModule的庫(kù),請(qǐng)傳入com.example.unwanted.GlideModule:
@Excludes( “com.example.unwanted.GlideModule”)
@GlideModule
public final class MyAppGlideModule extends AppGlideModule {}
您還可以排除多個(gè)模塊:
@Excludes({“com.example.unwanted.GlideModule”,“com.example.conflicing.GlideModule”})
@GlideModule
public final class MyAppGlideModule extends AppGlideModule {}
如果您仍在從Glide v3遷移過(guò)程中,可以使用@Excludes來(lái)排除LibraryGlideModules和已棄用的GlideModule實(shí)現(xiàn)。
為了保持與Glide v3的GlideModules的向后兼容性,Glide仍然從應(yīng)用程序和任何包含的庫(kù)中分析AndroidManifest.xml文件,并將包括清單中列出的任何舊的GlideModules。雖然此功能將在以后的版本中被刪除,但我們現(xiàn)在已經(jīng)保留了行為以減輕轉(zhuǎn)換。
如果您已經(jīng)遷移到Glide v4 AppGlideModule和LibraryGlideModule,則可以完全禁用清單解析。這樣做可以提高Glide的初始啟動(dòng)時(shí)間,并避免嘗試解析元數(shù)據(jù)時(shí)出現(xiàn)一些潛在的問(wèn)題。要禁用清單解析,請(qǐng)覆蓋AppGlideModule實(shí)現(xiàn)中的isManifestParsingEnabled()方法:
@GlideModule
public final class MyAppGlideModule extends AppGlideModule {
@Override
public boolean isManifestParsingEnabled(){
return false;
}
}