鍍金池/ 教程/ Android/ 配置
配置
Generated API
轉(zhuǎn)換
選項
過渡效果
關(guān)于Glide
緩存
調(diào)試
目標(biāo)
占位符
下載和設(shè)置
入門指南

配置

為了Glide的配置可以正常的工作,庫跟應(yīng)用程序需要執(zhí)行一序列的步驟。請注意,庫不希望注冊不需要的附加的組件。

庫必須:

  1. 添加一個或多個LibraryGlideModule實現(xiàn)
  2. 添加@GlideModule注解給每個LibraryGlideModule實現(xiàn)
  3. 添加Glide注解處理器依賴關(guān)系

一個使用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)用程序

應(yīng)用程序必須:

  1. 添加一個合適的AppGlideModule實現(xiàn)
  2. 添加一個或多個LibraryGlideModule實現(xiàn)
  3. AppGlideModule實現(xiàn)類和所有的LibraryGlideModule實現(xiàn)類添加@GlideModule注解
  4. 添加Glide注解處理類依賴關(guān)系
  5. AppGlideModules添加proguard.cfg的keep

在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

應(yīng)用選項

Glide允許應(yīng)用程序使用AppGlideModule實現(xiàn)完全控制Glide的內(nèi)存跟磁盤緩存用法。Glide嘗試給大多數(shù)應(yīng)用程序提供合理的默認(rèn)值,但是對于某些應(yīng)用程序,需要自定義這些值。一定要衡量避免任何性能下降的修改。

內(nèi)存緩存

默認(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方法的組件,可用的組件包括:

  1. ModelLoader加載自定義模型(URL, URI, 任意的POJO)和數(shù)據(jù)(輸入流,文件描述)
  2. ResourceDecoder解碼新的資源(Drawable,Bitmap)或者新的數(shù)據(jù)類型(輸入流,文件描述)
  3. Encoder寫數(shù)據(jù)(輸入流,文件描述)Glide的磁盤緩存
  4. ResourceTranscoder從一種資源(BitmapResource)轉(zhuǎn)換為其他類型的資源(DrawableResource)
  5. ResourceEncoder將資源(BitmapResource, DrawableResource)寫入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ù)載路徑粗略符合下一步驟:

  1. 模型->數(shù)據(jù)(由ModelLoader處理)
  2. 數(shù)據(jù)->資源(由ResourceDecoder處理)
  3. 資源->轉(zhuǎn)換資源(可選,由ResourceTranscoder處理)

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)和大小。

AppGlideModule

所有應(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)。

@GlideModule

為了讓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;
  }
}
上一篇:目標(biāo)下一篇:轉(zhuǎn)換