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