本文是基于郭霖glide源碼解析系列的學(xué)習(xí)筆記,在此記錄一下。
一、fragment巧用:
使用沒(méi)有界面的fragment來(lái)進(jìn)行生命周期的控制,活用fragment,這個(gè)技巧在很多開(kāi)源框架上都有使用,自己在項(xiàng)目中也有用到,確實(shí)不失為一種解決某些問(wèn)題的好方法;
二、glide緩存機(jī)制原理:
內(nèi)存緩存:
一個(gè)是弱引用來(lái)緩存正在使用中的圖片,一個(gè)是LruCache來(lái)緩存使用過(guò)的圖片。
采用計(jì)數(shù)的方式,當(dāng)acquired變量大于0的時(shí)候,說(shuō)明圖片正在使用中,也就應(yīng)該放到activeResources弱引用緩存當(dāng)中。
而經(jīng)過(guò)release()之后,如果acquired變量等于0了,說(shuō)明圖片已經(jīng)不再被使用了,就會(huì)將弱引用從map中移除,如果設(shè)置了緩存,
就會(huì)再將它put到LruResourceCache當(dāng)中。
磁盤(pán)緩存:
緩存原始圖片 or 緩存轉(zhuǎn)換過(guò)的圖片(默認(rèn)),硬盤(pán)緩存的實(shí)現(xiàn)也是使用的LruCache算法,原始圖片和轉(zhuǎn)換過(guò)的圖片只是緩存的key不一樣,
原始圖片的key使用的是圖片url,轉(zhuǎn)換過(guò)的圖片使用的是一堆參數(shù)生成的key。
三、高級(jí)技巧:
1.學(xué)習(xí)了glide緩存機(jī)制,知道緩存原理使用的key是圖片url或者根據(jù)url等一系列參數(shù)生成的,如果url后面拼接了類似token的數(shù)據(jù),那么圖片url就會(huì)動(dòng)態(tài)改變了。
因此glide緩存機(jī)制就失效的,為此我們通過(guò)讀取源碼發(fā)現(xiàn),可以通過(guò)創(chuàng)建一個(gè)自己的GlideUrl,重寫(xiě)getCacheKey()方法,在load的時(shí)候傳入即可。
2.獲取圖片對(duì)象GlideDrawable等,可以重寫(xiě)Target類,提供的有SimpleTarget。
3.預(yù)加載,preload()方法,原理是執(zhí)行一遍什么都不做就可以了。
4.下載圖片,downloadOnly(int width, int height)? 和 downloadOnly(Y target) 方法,前者需要在子線程執(zhí)行,因?yàn)樵趫?zhí)行過(guò)程中會(huì)阻塞線程,直到返回結(jié)果。后者需要重寫(xiě)一個(gè)實(shí)現(xiàn)Target接口的類。
5.變換,重寫(xiě)一個(gè)類繼承BitmapTransformation,重寫(xiě)transform方法;參考glide-transformations 開(kāi)源庫(kù)
6.自定義模塊,替換glide里的策略模式,如緩存策略、網(wǎng)絡(luò)請(qǐng)求策略
四、listener監(jiān)聽(tīng)機(jī)制:
類似冒泡式傳遞,onResourceReady()方法和onException()方法都有一個(gè)布爾值的返回值,返回false就表示這個(gè)事件沒(méi)有被處理,還會(huì)繼續(xù)向下傳遞,返回true就表示這個(gè)事件已經(jīng)被處理掉了,從而不會(huì)再繼續(xù)向下傳遞。舉個(gè)簡(jiǎn)單點(diǎn)的例子,如果我們?cè)赗equestListener的onResourceReady()方法中返回了true,那么就不會(huì)再回調(diào)Target的onResourceReady()方法了。