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