android 使用Glide

簡介

Glide是android快速有效開源的媒體管理和圖片加載框架,這個(gè)框架包括媒體編碼,內(nèi)存和硬盤緩存,資源池這些簡單容易使用的用戶接口。
Gilde支持獲取,解碼展示video,image,動(dòng)態(tài)的gif。Gilide包括一個(gè)靈活的API,這些API允許開發(fā)者以插件化的方式加入到大多數(shù)網(wǎng)絡(luò)棧中。默認(rèn)情況下Glide使用自定義的HttpUrlConnection基礎(chǔ)棧,但是也包括以插件的方式存在于Google的Volley工程或者Square的OkHttp庫的實(shí)用工具庫。
Glide的主要解決的問題是使加載images的任何類型的可滾動(dòng)列表盡可能平滑的滾動(dòng),但是Glide同時(shí)對(duì)大多數(shù)任何需要獲取,重新改變圖片尺寸,展示遠(yuǎn)程圖片也非常有效。

怎么使用GIide

最簡單的方式是像這樣:

// For a simple view:
@Override public void onCreate(Bundle savedInstanceState) {
  ...
  ImageView imageView = (ImageView) findViewById(R.id.my_image_view);

  Glide.with(this).load("http://goo.gl/gEgYUd").into(imageView);
}

// For a simple image list:
@Override public View getView(int position, View recycled, ViewGroup container) {
  final ImageView myImageView;
  if (recycled == null) {
    myImageView = (ImageView) inflater.inflate(R.layout.my_image_view, container, false);
  } else {
    myImageView = (ImageView) recycled;
  }

  String url = myUrls.get(position);

  Glide
    .with(myFragment)
    .load(url)
    .centerCrop()
    .placeholder(R.drawable.loading_spinner)
    .crossFade()
    .into(myImageView);

  return myImageView;
}

兼容性問題

*Android SDK:Glide需要最小API10。
*圓形圖片: CircleImageView/CircularImageView/RoundedImageView 這些在TransitionDrawable和GIF動(dòng)的時(shí)候有問題(.crossFade()的時(shí)候.thumbnail()或者.placeholder()),使用TransitionDrawable(.circleCrop()在v4中可用)或者.dontAnimate來修復(fù)這個(gè)問題。
* 超大圖片(地圖,漫畫):Glide可以通過降采樣的方式來加載超大的圖片,但是不支持縮放,因?yàn)樗麄冃枰付ㄙY源優(yōu)化(比如平鋪)來解決內(nèi)存溢出。

懶惰配置

從Glide3.5開始,可以使用GlideModule接口來配置Glide并且可以在第一次請(qǐng)求Glide像ModelLoaders一樣自動(dòng)注冊(cè)組件。

創(chuàng)建一個(gè)GlideMode

要想使用和注冊(cè)一個(gè)GlideMode,首先需要實(shí)現(xiàn)配置和組件的接口:

package com.mypackage;

public class MyGlideModule implements GlideModule {
    @Override public void applyOptions(Context context, GlideBuilder builder) {
        // Apply options to the builder here.
    }

    @Override public void registerComponents(Context context, Glide glide) {
        // register ModelLoaders here.
    }
}

可以實(shí)現(xiàn)多個(gè)GlideModlue,但是每一個(gè)必須得添加到ProGuard/DexGuard異常并且每一個(gè)必須在manifest中有單獨(dú)的meta-data標(biāo)簽。添加到pro guard.cfg/proguard.pro文件會(huì)允許module通過反射來實(shí)例化。這樣確保ProGuard和DexGuard不使它失效。這個(gè)反射性能的開銷是最小的,因?yàn)楫?dāng)Glide第一次被請(qǐng)求創(chuàng)建的時(shí)候每個(gè)module只實(shí)例化一次。

-keepnames class com.mypackage.MyGlideModule
# or more generally:
#-keep public class * implements com.bumptech.glide.module.GlideModule

# for DexGuard only
-keepresourcexmlelements manifest/application/meta-data@value=GlideModule
<manifest ...>
    <!-- ... permissions -->
    <application ...>
        <meta-data
            android:name="com.mypackage.MyGlideModule"
            android:value="GlideModule" />
        <!-- ... activities and other components -->
    </application>
</manifest>

庫工程

庫工程會(huì)定義一個(gè)或更多GlideModule。如果一個(gè)工程在它的manifest中添加了一個(gè)module,使用Gradle構(gòu)建的應(yīng)用(或者任何使用manifest合并的系統(tǒng))依賴的庫工程會(huì)自動(dòng)pick up庫的module。如果沒有manifest合并可用,庫module必須手動(dòng)列到應(yīng)用的manifest中。

全局配置

Glide允許配置一系列不同的全局的options來應(yīng)用到全部請(qǐng)求。使用GlideModule#applyOptions提供的GlideBuilder。

硬盤緩存

使用GlideBuilder的setDiskCache()方法設(shè)置硬盤緩存的位置和最大值。也可以使用DiskCacheAdapter或者使用你自己實(shí)現(xiàn)的DiskCache接口來使默認(rèn)的緩存不可用。硬盤緩存是在后臺(tái)線程使用DiskCache.Factory接口構(gòu)建來避免strict mode。
默認(rèn)情況下Glide使用InternalCacheDiskCacheFactory類來構(gòu)建硬盤緩存。這個(gè)內(nèi)部緩存工廠將硬盤緩存放置在應(yīng)用的內(nèi)置緩存目錄并且設(shè)置最大值為250M。使用這個(gè)緩存目錄而不是SD卡意味著其他應(yīng)用無法訪問你下載的圖片。

大小
builder.setDiskCache(
  new InternalCacheDiskCacheFactory(context, yourSizeInBytes));
位置
builder.setDiskCache(
  new InternalCacheDiskCacheFactory(context, cacheDirectoryName, yourSizeInBytes));

同樣可以使用ExternalCacheDiskCacheFactory來將緩存放置到sd卡公共的緩存目錄。

builder.setDiskCache(
  new ExternalCacheDiskCacheFactory(context, cacheDirectoryName, yourSizeInBytes));

如果想使用其他自定義位置,可以使用DiskLruCacheFactory的不同構(gòu)造方法:

// If you can figure out the folder without I/O:
// Calling Context and Environment class methods usually do I/O.
builder.setDiskCache(
  new DiskLruCacheFactory(getMyCacheLocationWithoutIO(), yourSizeInBytes));

// In case you want to specify a cache folder ("glide"):
builder.setDiskCache(
  new DiskLruCacheFactory(getMyCacheLocationWithoutIO(), "glide", yourSizeInBytes));

// In case you need to query the file system while determining the folder:
builder.setDiskCache(new DiskLruCacheFactory(new CacheDirectoryGetter() {
    @Override public File getCacheDirectory() {
        return getMyCacheLocationBlockingIO();
    }
}), yourSizeInBytes);

注意:從Android 4.2開始,指定目錄路徑的硬編碼不是一個(gè)好的方式,因?yàn)樵谝粋€(gè)設(shè)備上可以有多個(gè)用戶。
如果想完全控制緩存的創(chuàng)建,可以自己實(shí)現(xiàn)DiskCache.Factory接口,然后使用DiskLruCacheWrapper在你想要的位置創(chuàng)建緩存。

builder.setDiskCache(new DiskCache.Factory() {
    @Override public DiskCache build() {
        File cacheLocation = getMyCacheLocationBlockingIO();
        cacheLocation.mkdirs();
        return DiskLruCacheWrapper.get(cacheLocation, yourSizeInBytes);
    }
});

內(nèi)存緩存和池

GlideBuilder類允許設(shè)置大小和實(shí)現(xiàn)Glide的MemoryCache和BitmapPool。

位置

默認(rèn)大小是由MemorySizeCalculator這個(gè)類決定的。這個(gè)類會(huì)把屏幕尺寸可用的內(nèi)存來給出一個(gè)合理的默認(rèn)大小。如果想調(diào)整默認(rèn)值需要構(gòu)造自己的實(shí)例。

MemorySizeCalculator calculator = new MemorySizeCalculator(context);
int defaultMemoryCacheSize = calculator.getMemoryCacheSize();
int defaultBitmapPoolSize = calculator.getBitmapPoolSize();

如果想在你應(yīng)用的一定時(shí)間段內(nèi)動(dòng)態(tài)調(diào)整Glide的內(nèi)存足跡,這樣使用:

Glide.get(context).setMemoryCategory(MemoryCategory.HIGH);
內(nèi)存緩存

Glide的內(nèi)存緩存是用來在內(nèi)存中保持資源,這樣他們不用通過執(zhí)行I/O操作就可以立刻被使用。
使用GlideBuilder的setMemoryCache()方法來設(shè)置大小和實(shí)現(xiàn)你希望使用的內(nèi)存緩存。LruResourceCache類是Glide的默認(rèn)實(shí)現(xiàn)。可以以內(nèi)存子節(jié)大小來自定義最大值:

builder.setMemoryCache(new LruResourceCache(yourSizeInBytes));
圖片池

Glide的圖片池用來允許圖片的各種不同尺寸被重用,這樣基本上可以減少被圖片解碼時(shí)引起像素?cái)?shù)組分配的垃圾回收。
使用GlideBuilder的setBitmapPool()方法來設(shè)置和實(shí)現(xiàn)圖片池。LruBitmapPool類是Glide的默認(rèn)實(shí)現(xiàn)。LruBitmapPool類使用LRU算法來保持最近最常用的圖片。通過下列代碼可以以內(nèi)存子節(jié)大小來自定義最大值:

builder.setBitmapPool(new LruBitmapPool(sizeInBytes));
圖片格式

GlideBuilder類支持設(shè)置一個(gè)全局默認(rèn)優(yōu)先的圖片配置。
默認(rèn)情況下Glide會(huì)使用RGB_565,因?yàn)樗灰竺總€(gè)像素2個(gè)子節(jié),這樣會(huì)是系統(tǒng)默認(rèn)最高質(zhì)量ARGB_8888一半的內(nèi)存消耗。但是RGB_565在處理某些條紋圖片的時(shí)候會(huì)有問題而且不支持透明度。
如果在你應(yīng)用中條紋是個(gè)問題而且你想要最可能高的圖片質(zhì)量,使用GlideBuild的setDecodeFormat方法設(shè)置DecodeFormat.ALWAYS_ARGB_8888作為Glide的優(yōu)先圖片配置。

builder.setDecodeFormat(DecodeFormat.ALWAYS_ARGB_8888);
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容