分析glide源碼后的總結(jié)

1.glide的網(wǎng)絡(luò)請求用的是什么?

httpurlconnection

2.glide如何和activity同步生命周期?

通過創(chuàng)建一個(gè)隱藏的fragment掖疮,同步activity的生命周期缠局。如果傳入的上下文是application,那么glide的請求生命周期和應(yīng)用一樣長依许。

3.glide的緩存key是如何生成的?

1.緩存原圖的話key主要是有url組成
2.緩存轉(zhuǎn)換后的圖的key是由width缀蹄,height峭跳,encoder等十個(gè)參數(shù)生成。

4.glide內(nèi)存緩存怎么實(shí)現(xiàn)的缺前?

內(nèi)存緩存由兩部分組成坦康,由Lrucache算法和弱引用activiResources 一個(gè)hashMap集合組成,這個(gè)集合存儲正在使用的圖片诡延。這個(gè)hashMap集合可以確保圖片不會被lrucache算法回收掉滞欠。也就是說glide將正在使用的圖片用activeResources保存,不在使用的用LruCache來保存肆良。

5.glide的硬盤緩存

glide磁盤緩存可以緩存原始圖片和轉(zhuǎn)換后的圖片筛璧,如果是原始圖片,那么緩存key就是id和signature惹恃,如果緩存的是轉(zhuǎn)換后的圖片那緩存key是由寬高等十多個(gè)參數(shù)組成夭谤。磁盤緩存使用的DiskLrucache。

6.glide緩存失效問題

當(dāng)我們請求一張圖片的url后面加入了可變token的時(shí)候巫糙,那么我們glide的緩存就會失效朗儒,因?yàn)榫彺鎘ey的組成就有url,解決這個(gè)問題可以自定義GlideUrl参淹,重寫getCacheKey()這個(gè)方法醉锄。

7.glide的預(yù)加載功能

glide提供了預(yù)加載接口,就是preLoad()方法浙值,這個(gè)方法有兩個(gè)重載恳不,一個(gè)是加載原始圖片大小,一個(gè)是指定寬和高开呐,如果使用preLoad()預(yù)加載圖片烟勋,那么需要指定緩存策略為原圖规求,否則再真正顯示用into的時(shí)候,還是會去網(wǎng)絡(luò)加載卵惦,因?yàn)榫彺鎘ey不一致阻肿,獲取不到緩存圖片。當(dāng)然into加載的時(shí)候也需要指定緩存策略為緩存原圖沮尿。

8.如何獲取緩存圖片的路徑丛塌。

要想獲取一個(gè)緩存圖片的路徑可以使用downloadOnly()方法,這個(gè)方法會執(zhí)行下載圖片的邏輯蛹找,并且下載i 之后是一個(gè)文件,可以獲取路徑哨坪,必須在子線程開啟下載庸疾。

public void downloadImage(View view) {
    new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                final Context context = getApplicationContext();
                FutureTarget<File> target = Glide.with(context)
                                                 .load(url)
                                                 .downloadOnly(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL);
                final File imageFile = target.get();
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(context, imageFile.getPath(), Toast.LENGTH_LONG).show();
                    }
                });
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }).start();
}
9.glide的錯(cuò)誤調(diào)試

glide有一個(gè)listener()方法,這個(gè)方法在into之前或者preLoad()之前調(diào)用,requestListener中的兩個(gè)方法都有返回值当编,當(dāng)都返回false的時(shí)候包括錯(cuò)誤展位圖和正常圖片顯示才會繼續(xù)執(zhí)行届慈。

Glide.with(this)
            .load(url)
            .listener(new RequestListener<String, GlideDrawable>() {
                @Override
                public boolean onException(Exception e, String model, Target<GlideDrawable> target,
                    boolean isFirstResource) {
                    return false;
                }

                @Override
                public boolean onResourceReady(GlideDrawable resource, String model,
                    Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) {
                    return false;
                }
            })
            .into(imageView);
}
10.glide圖片變換導(dǎo)致的充滿全屏幕問題

可以通過設(shè)置dontTrasform() or override(Target.SIZE_ORIGINSL,Target.SIZE_ORIGINSL) 方法解決。

11.glide模塊的自定義

glide支持對一些功能的自定義忿偷,以及一些組建的替換金顿。

public class MyGlideModule implements GlideModule {
  @Override
  public void applyOptions(Context context, GlideBuilder builder) {
  }

  @Override
  public void registerComponents(Context context, Glide glide) {
  }
}

通過實(shí)現(xiàn)GlideModule可以實(shí)現(xiàn)一些功能的自定義和一些自定義組建的替換,applyOptions方法中實(shí)現(xiàn)功能的自定義鲤桥,registerComponents這個(gè)方法實(shí)現(xiàn)自定義組建的替換揍拆,這兩個(gè)方法互相獨(dú)立使用。
下面是glide允許自定義的功能列表:

setMemoryCache() 
用于配置Glide的內(nèi)存緩存策略茶凳,默認(rèn)配置是LruResourceCache嫂拴。

setBitmapPool() 
用于配置Glide的Bitmap緩存池,默認(rèn)配置是LruBitmapPool贮喧。

setDiskCache() 
用于配置Glide的硬盤緩存策略筒狠,默認(rèn)配置是InternalCacheDiskCacheFactory。

setDiskCacheService() 
用于配置Glide讀取緩存中圖片的異步執(zhí)行器箱沦,默認(rèn)配置是FifoPriorityThreadPoolExecutor辩恼,也就是先入先出原則。


setResizeService() 
用于配置Glide讀取非緩存中圖片的異步執(zhí)行器谓形,默認(rèn)配置也是FifoPriorityThreadPoolExecutor灶伊。

setDecodeFormat() 
用于配置Glide加載圖片的解碼模式,默認(rèn)配置是RGB_565寒跳。

其中最常見的就是自定義緩存路徑和自定義圖片編碼模式

public class MyGlideModule implements GlideModule {

    public static final int DISK_CACHE_SIZE = 500 * 1024 * 1024;

    @Override
    public void applyOptions(Context context, GlideBuilder builder) {
        builder.setDiskCache(new ExternalCacheDiskCacheFactory(context, DISK_CACHE_SIZE));
        builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888);
    }

    @Override
    public void registerComponents(Context context, Glide glide) {

    }

}

上面這段代碼實(shí)現(xiàn)了將glide的緩存文件緩存到sd卡谁帕,并且指定圖片編碼模式是ARGB_8888,Android默認(rèn)是RGB_565.

替換glide組件

glide中可替換的組件有如下:

 Glide(Engine engine, MemoryCache memoryCache, BitmapPool bitmapPool, Context context, DecodeFormat decodeFormat) {
        ...

        register(File.class, ParcelFileDescriptor.class, new FileDescriptorFileLoader.Factory());
        register(File.class, InputStream.class, new StreamFileLoader.Factory());
        register(int.class, ParcelFileDescriptor.class, new FileDescriptorResourceLoader.Factory());
        register(int.class, InputStream.class, new StreamResourceLoader.Factory());
        register(Integer.class, ParcelFileDescriptor.class, new FileDescriptorResourceLoader.Factory());
        register(Integer.class, InputStream.class, new StreamResourceLoader.Factory());
        register(String.class, ParcelFileDescriptor.class, new FileDescriptorStringLoader.Factory());
        register(String.class, InputStream.class, new StreamStringLoader.Factory());
        register(Uri.class, ParcelFileDescriptor.class, new FileDescriptorUriLoader.Factory());
        register(Uri.class, InputStream.class, new StreamUriLoader.Factory());
        register(URL.class, InputStream.class, new StreamUrlLoader.Factory());
        register(GlideUrl.class, InputStream.class, new HttpUrlGlideUrlLoader.Factory());
        register(byte[].class, InputStream.class, new StreamByteArrayLoader.Factory());

        ...
    }

一般主要可能替換的組件就是網(wǎng)絡(luò)組件,所以glide給我們提供了非常簡單的方式去繼承其他的網(wǎng)絡(luò)庫冯袍,比如okhttp:

dependencies {
    compile 'com.squareup.okhttp3:okhttp:3.9.0'
    compile 'com.github.bumptech.glide:okhttp3-integration:1.5.0@aar'
}

只需要加入這樣的依賴我們的網(wǎng)絡(luò)庫就替換成了okhttp匈挖。

glide如果將結(jié)果切換回主線程:

通過mainLooper()創(chuàng)建了handler碾牌,通過handler實(shí)現(xiàn)切換回主線程!

參考資料:
glide源碼
郭霖glide源碼分析

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末儡循,一起剝皮案震驚了整個(gè)濱河市舶吗,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌择膝,老刑警劉巖誓琼,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異肴捉,居然都是意外死亡腹侣,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進(jìn)店門齿穗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來傲隶,“玉大人,你說我怎么就攤上這事窃页《逯辏” “怎么了?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵脖卖,是天一觀的道長乒省。 經(jīng)常有香客問我,道長畦木,這世上最難降的妖魔是什么袖扛? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮十籍,結(jié)果婚禮上攻锰,老公的妹妹穿的比我還像新娘。我一直安慰自己妓雾,他們只是感情好娶吞,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著械姻,像睡著了一般妒蛇。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上楷拳,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天绣夺,我揣著相機(jī)與錄音,去河邊找鬼欢揖。 笑死陶耍,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的她混。 我是一名探鬼主播烈钞,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼泊碑,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了毯欣?” 一聲冷哼從身側(cè)響起馒过,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎酗钞,沒想到半個(gè)月后腹忽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡砚作,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年窘奏,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片葫录。...
    茶點(diǎn)故事閱讀 38,650評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡着裹,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出压昼,到底是詐尸還是另有隱情求冷,我是刑警寧澤瘤运,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布窍霞,位于F島的核電站,受9級特大地震影響拯坟,放射性物質(zhì)發(fā)生泄漏但金。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一郁季、第九天 我趴在偏房一處隱蔽的房頂上張望冷溃。 院中可真熱鬧,春花似錦梦裂、人聲如沸似枕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽凿歼。三九已至,卻和暖如春冗恨,著一層夾襖步出監(jiān)牢的瞬間答憔,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工掀抹, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留虐拓,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓傲武,卻偏偏與公主長得像蓉驹,于是被迫代替她去往敵國和親城榛。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評論 2 349

推薦閱讀更多精彩內(nèi)容

  • 學(xué)習(xí)來源:郭霖大師博客地址 1戒幔、圖片加載框架挺多吠谢,如Volley、Glide诗茎、Picasso工坊、Fresco、本次是...
    子謙寶寶閱讀 1,749評論 0 6
  • 7.1 壓縮圖片 一敢订、基礎(chǔ)知識 1王污、圖片的格式 jpg:最常見的圖片格式。色彩還原度比較好楚午,可以支持適當(dāng)壓縮后保持...
    AndroidMaster閱讀 2,496評論 0 13
  • 目前市場上的圖片異步請求框架有很多昭齐,比如Volley,Fresco,Glide,Picasso等,之前項(xiàng)目中用的一...
    junjunxx閱讀 1,133評論 1 8
  • 女: 我暗戀你好久了 做我男朋友吧 男: 滾 老子不喜歡你 女: 為什么 男: 長得那么丑 還想跟我在一起 也不照...
    桃花漸暖閱讀 1,207評論 0 1
  • 《現(xiàn)代漢語詞典》對文化的解釋是:人類在社會歷史發(fā)展過程中所創(chuàng)造的物質(zhì)財(cái)富和精神財(cái)富的總和。 如果按照這個(gè)定義來理解...
    乾小龍閱讀 315評論 0 1