1、github官網(wǎng):? ? ? https://github.com/bumptech/glide? 2、概念? ? ? http://www.itdecent.cn/p/b160e8a0d88e? 結(jié)合github官網(wǎng)的介紹? 簡單總結(jié)下? 1、谷歌推薦使用? 2、一個 android 平臺上的快速和高效的開源的多媒體資源管理庫,提供 多媒體文件的壓縮,內(nèi)存和磁盤緩存, 資源池的接口。? 3、可以最大性能地在 Android 設(shè)備上讀取、解碼、顯示圖片和視頻。? 4、可以將遠(yuǎn)程的圖片、視頻、動畫圖片等緩存在設(shè)備本地,便于提高用戶瀏覽圖片的流暢體驗。? 5、網(wǎng)址下邊有特點介紹? 或者想下面網(wǎng)址一樣簡單總結(jié)? http://www.itdecent.cn/p/5d156bdee68b? Glide是一個Android高性能媒體框架。支持圖片、Gif、原生視頻的加載。使用簡單,可擴(kuò)展性強,性能優(yōu)異,Google推薦使用。? 3、優(yōu)勢? ? ? 1、Universal Image Loader,Volley,Picasso、Fresco、Glide比較? ? http://www.itdecent.cn/p/239df3b480d0(簡明扼要,特別是圖片左邊的總結(jié)) http://blog.csdn.net/richiezhu/article/details/46968569/(最下邊有做總結(jié))? 2、Gilde、Picasso、Fresco? ? http://www.itdecent.cn/p/48311f567969(總結(jié)的非常全面到位) http://www.itdecent.cn/p/6d5ddfc4eabb http://www.itdecent.cn/p/061d5ab2f9d2 http://www.itdecent.cn/p/4ed015142857 簡單總結(jié)下 1、先比較Glide和Picasso? ? 1、總體來講? 二者極為相似,有著近乎相同的API的使用風(fēng)格,但Glide在緩存策略和加載gif方面略勝一籌。2、Glide的with方法不光接受Context,還接受Activity和Fragment。? 圖片加載會和Activity/Fragment的生命周期保持一致,所以推薦傳參的時候傳遞Activity和Fragment給Glide,而不是Context。3、默認(rèn)加在格式? 普通情況下,Glide加載的圖片質(zhì)量要差于Picasso。? 這是因為Glide默認(rèn)的Bitmap格式是RGB-565比ARGB-8888格式的內(nèi)存開銷要小一半。? 想要提高Glide的圖片效果,可以創(chuàng)建一個新的GlideModule將Bitmap格式轉(zhuǎn)換到ARGB-8888。? 同時在AndroidManifest.xml中將GlideModule定義為meta-data。4、內(nèi)存消耗? Picasso內(nèi)存開銷大,原因在于Picasso加載了全尺寸的圖片到內(nèi)存,然后讓GPU來實時重繪大小。? Glide加載的大小和ImageView的大小是一致的。? Picasso也是可以指定加載圖片大小的,但是問題在于你需要主動計算ImageView的大小,或者說你的ImageView大小是具體的值(而不是wrap_content)5、緩存策略? Picasso緩存的是全尺寸的,Picasso只緩存一個全尺寸的? Glide緩存的是跟ImageView尺寸相同的,假如你要在另外一個地方再次以不同尺寸顯示,需要重新下載,調(diào)整成新尺寸的大小,然后將這個尺寸的也緩存起來。? 可以改變這種行為,看上面第四個網(wǎng)址6、gif? Glide支持gif,Picasso不支持gif7、包的大小? Picasso (v2.5.1)的大小約118kb,而Glide (v3.5.2)的大小約430kb。? ? 2、Fresco(重點看第二個網(wǎng)址)? ? 1、最大特點在于它的內(nèi)存管理? Fresco 會將圖片放到一個特別的內(nèi)存區(qū)域,3級緩存設(shè)計(2級內(nèi)存,1級磁盤)2、漸進(jìn)式呈現(xiàn)、動圖加載gif等3、其他特點看第二個網(wǎng)址4、最大缺點,體積大 3、綜合比較? ? 各網(wǎng)址最后部分Glide在多方面都優(yōu)于Picasso,特別是內(nèi)存消耗、緩存策略、加載gif上,更快更流暢? ? ? ? ? ? Picasso比Glide體積小很多且圖像質(zhì)量比Glide高。Fresco是性能最好的,但體積太大,如果應(yīng)用沒有太多圖片需求,不推薦使用Fresco。? 4、使用? ? ? http://www.itdecent.cn/p/8d0fb78659a9? 其中提到了非常有用的幾點? 1、轉(zhuǎn)換Transformations? ? 開發(fā)中經(jīng)常要將圖片剪裁成圓角、圓形等 http://www.itdecent.cn/p/976c86fa72bc(可以導(dǎo)入類似這樣的圖像轉(zhuǎn)換開源庫)? 2、回調(diào)Targets? ? 1、SimpleTarget轉(zhuǎn)為Bitmap再根據(jù)需要處理
2、ViewTarget(重點)
可以將圖片設(shè)置到任意View中,而不只局限于imageview,具體操作看網(wǎng)址
3、NotificationTarget
加載圖片到 Notifications,看網(wǎng)址
3、用GlideModule自定義 Glide(重點)
看網(wǎng)址和約車看房
5、原理
6、源碼
1、初次看,建議照著下面的網(wǎng)址來看,按glide鏈?zhǔn)胶瘮?shù)調(diào)用的順序看
http://www.itdecent.cn/p/0789b82b3f80
2、總體流程
http://www.itdecent.cn/p/adada3a6e117(開頭圖解整體流程)
http://www.itdecent.cn/p/03d536c43936(最后總結(jié)整體流程)
3、專題的解析
http://www.itdecent.cn/p/c7746ffed0c7(圖片加載的生命周期)
http://www.itdecent.cn/p/87a75044a174(如何動態(tài)測量獲取ImageView大?。?/p>
自己總結(jié):
1、首先通過Glide.with方法生成RequestManager對象來管理請求
可以傳入Activity、Fragment、Context類型的參數(shù),里面會用到ActivityFragmentLifecycle接口(新建一個不顯示的Fragment,在里面有此接口)
來實現(xiàn)圖片加載與Activity或Fragment生命周期一樣。
另外,RequestManager對象的生成也會調(diào)用Glide.get()方法(雙重校驗的單例模式),Glide.get()方法中有對設(shè)置的GlideModule的獲取,并應(yīng)用里面的配置。
2、然后調(diào)用RequestManager.load方法得到相應(yīng)的RequestBuilder對象
可以傳入多種類型參數(shù),比如圖片url,本地資源文件,F(xiàn)ile文件等
3、通過Builder建造者模式不斷給RequestBuilder添加條件,
比如裁剪,優(yōu)先級,占位圖,緩存策略等等
4、通過into方法傳入目的target,并開啟請求
5、查看目標(biāo)View的tag中獲取看看是否有request,如果有則清除。然后用新建的request來覆蓋。
6、執(zhí)行request,三級緩存策略,先看緩存中是否存在EngineResource(通過LruResourceCache來實現(xiàn)),再看是否有EngineResource的若引用,
最后看Map中是否存在EngineJob。如果有則直接返回結(jié)果并進(jìn)行相應(yīng)加載
7、new并執(zhí)行EngineRunnable這個DecoderJob的封裝
EngineJob管理兩個線程池,一個磁盤線程池,一個資源線程池,先從磁盤獲取,磁盤沒有再從其他地方獲取。
8、在DecoderJob內(nèi)部查看是否存在相應(yīng)的InputStream或者是ParcelFileDescriptor,如果已經(jīng)存在,則直接將其通過loadProviderdecode成相應(yīng)的Bitmap,gif等。
否則就通過fetcher先將我們通過load傳入的路徑進(jìn)行解析成InputStream、ParcelFileDescriptor,再decode。