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

配置

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

庫(kù)

庫(kù)必須:

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

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

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

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

在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

應(yīng)用選項(xiàng)

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

內(nèi)存緩存

默認(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());
  }
}

磁盤(pán)緩存

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();
        }
    });
  }
}

注冊(cè)組件

應(yīng)用程序和庫(kù)都可以注冊(cè)一些繼承Glide方法的組件,可用的組件包括:

  1. ModelLoader加載自定義模型(URL, URI, 任意的POJO)和數(shù)據(jù)(輸入流,文件描述)
  2. ResourceDecoder解碼新的資源(Drawable,Bitmap)或者新的數(shù)據(jù)類(lèi)型(輸入流,文件描述)
  3. Encoder寫(xiě)數(shù)據(jù)(輸入流,文件描述)Glide的磁盤(pán)緩存
  4. ResourceTranscoder從一種資源(BitmapResource)轉(zhuǎn)換為其他類(lèi)型的資源(DrawableResource)
  5. ResourceEncoder將資源(BitmapResource, DrawableResource)寫(xiě)入Glide的磁盤(pán)緩存

注冊(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ù)載路徑粗略符合下一步驟:

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

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)處理其余部分。

模塊類(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)和大小。

AppGlideModule

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

@GlideModule

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