Gilde簡單介紹:
Glide是一款由圖片加載框架,使得我們可以在Android平臺上以極度簡單的方式加載和展示圖片
Glide.with(this).load(url).into(imageView)這是Glide的核心代碼 他這行代碼包括加載網絡上的圖片均函、加載手機本地的圖片座享、加載應用資源中的圖片
Glide.with()方法用于創(chuàng)建一個加載圖片的實例
load()方法,這個方法用于指定待加載的圖片資源
into()方法晶通,這個方法就很簡單了,我們希望讓圖片顯示在哪個ImageView
在Gilde中我們可以指定加載圖片的大小使用override()方法 在括號中傳入自定義加載圖片的大小
占位符:
在Gilde當中因為我們加載網絡數據的時候 需要稍等一會圖片才會加載出來 我們不能顯示空白頁面 所以我們要用到占位圖我們只需要在剛才的三步走之間插入了一個placeholder()方法 在括號里傳入一個圖片路徑就行了哟玷,我們在運行的時候 佷可能看不見占位圖圖片 因為Gilde有緩存功能 在第一次我們記載圖片的時候他就已經緩存下來了 所以后面我們再次使用的時候 就可能看不見占位圖圖片 如果我們想看見 占位圖圖片可以在使用占位圖方法后面加一個diskCacheStrategy()方法狮辽,并傳入DiskCacheStrategy.NONE參數,這樣就可以禁用掉Glide的緩存功能巢寡。
異常占位符
這只是占位圖的一種喉脖,除了這種加載占位圖之外,還有一種異常占位圖抑月。異常占位圖就是指树叽,如果因為某些異常情況導致圖片加載失敗,比如說手機網絡信號不好谦絮,這個時候就顯示這張異常占位圖 error()方法就是可以指定異常占位圖
Gilde有一個很強大的功能Glide是支持加載動態(tài)圖片的题诵。须误,Picasso是不會支持加載動態(tài)圖片的 Gilde在加載圖片的時候他在加載圖片時會自動識別他的圖片格式 然后對他進行加載
在Gilde中有很多方法 加載動態(tài)圖片時 我們就想要第一幀 調用asBitmap()
只加載動態(tài)圖片我們使用asGif()方法替代asBitmap()方法 如果不是動態(tài)圖片 那么會加載失敗
Gilde源碼分析:
With()
在Gilde源碼中 with()方法是一組靜態(tài)方法京痢,它有好幾個方法重載with()方法的重載種類非常多,既可以傳入Activity,也可以傳入Fragment或者是Context 每一個with()方法重載的代碼都非常簡單携茂,都是先調用RequestManagerRetriever的靜態(tài)get()方法得到一個RequestManagerRetriever對象,這個靜態(tài)get()方法就是一個單例實現,沒什么需要解釋的咐扭。然后再調用RequestManagerRetriever的實例get()方法蝗肪,去獲取RequestManager對象。
RequestManagerRetriever類中看似有很多個get()方法的重載,什么Context參數,Activity參數,Fragment參數等等醇疼,實際上只有兩種情況而已,即傳入Application類型的參數陕赃,和傳入非Application類型的參數。
當我們在Glide.with()方法中傳入的是一個Application對象,那么這里就會調用帶有Context參數的get()方法重載忱反,然后會調用getApplicationManager()方法來獲取一個RequestManager對象
當我傳入非Application參數的情況。不管你在Glide.with()方法中傳入的是Activity米者、FragmentActivity蔓搞、v4包下的Fragment机蔗、還是app包下的Fragment梆掸,最終的流程都是一樣的咱枉,那就是會向當前的Activity當中添加一個隱藏的Fragment徒恋。為什么要添加一個隱藏的Fragment呢?因為Glide需要知道加載的生命周期
我們是在非主線程當中使用的Glide欢伏,那么不管你是傳入的Activity還是Fragment入挣,都會被強制當成Application來處理 with()方法其實就是為了得到一個RequestManager對象而已,然后Glide會根據我們傳入with()方法的參數來確定圖片加載的生命周期
Load()
load()方法是在RequestManager類當中的,在RequestManager中也有很多個load()方法的重載 load()方法首先調用fromString()方法硝拧,再調用load()方法径筏,然后把傳入的圖片URL地址傳進去 fromString()方法調用了loadGeneric()方法,并且指定參數為String.class河爹,因為load()方法傳入的是一個字符串參數 主要的工作都是在loadGeneric()方法中進行的
當中會調用兩個方法來獲取ModelLoader對象 Glide.buildStreamModelLoader()方法和Glide.buildFileDescriptorModelLoader()方法 ModelLoader對象是用于加載圖片的匠璧,而我們給load()方法傳入不同類型的參數,這里也會得到不同的ModelLoader對象 我們傳入String.class會得到一個StreamStringLoader對象咸这,它是實現了ModelLoader接口的
loadGeneric()方法是要返回一個DrawableTypeRequest對象的夷恍,因此在loadGeneric()方法的最后又去new了一個DrawableTypeRequest對象 然后把剛才獲得的ModelLoader對象傳進去,
Drawable4TypeRequest的作用它提供了asBitmap()和asGif()這兩個方法媳维,分別是用于強制指定加載靜態(tài)圖片和動態(tài)圖片 DrawableTypeRequest的父類是DrawableRequestBuilder并不是load
Into()
into()方法的具體都是在DrawableRequestBuilder的父類GenericRequestBuilder中 在
GenericRequestBuilder中有一個glide.buildImageViewTarget()方法酿雪,這個方法會構建出一個Target對象,Target對象則是用來最終展示圖片用的侄刽,在buildTarget()方法中會根據傳入的class參數來構建不同的Target對象指黎。class參數其實基本上只有兩種情況,如果你在使用Glide加載圖片的時候調用了asBitmap()方法州丹,那么這里就會構建出BitmapImageViewTarget對象醋安,否則的話構建的都是GlideDrawableImageViewTarget對象
Glide緩存
在緩存這一功能上,Glide又將它分成了兩個模塊墓毒,一個是內存緩存吓揪,一個是硬盤緩存。這兩個緩存模塊的作用各不相同所计,內存緩存的主要作用是防止應用重復將圖片數據讀取到內存當中柠辞,而硬盤緩存的主要作用是防止應用重復從網絡或其他地方重復下載和讀取數據。內存緩存和硬盤緩存的相互結合才構成了Glide極佳的圖片緩存效果
內存緩存:
Gilde默認是緩存 當我們不想緩存時 只需要調用skipMemoryCache()方法并傳入true主胧,就表示禁用掉Glide的內存緩存功能 Glide內存緩存的實現使用的LruCache算法叭首。不過除了LruCache算法之外,Glide還結合了一種弱引用的機制踪栋,共同完成了內存緩存功能
硬盤緩存:
調用diskCacheStrategy()方法并傳入DiskCacheStrategy.NONE焙格,就可以禁用掉Glide的硬盤緩存功能 在diskCacheStrategy()中有四種參數
?DiskCacheStrategy.NONE: 表示不緩存任何內容。
?DiskCacheStrategy.SOURCE: 表示只緩存原始圖片己英。
?DiskCacheStrategy.RESULT: 表示只緩存轉換過后的圖片(默認選項)间螟。
?DiskCacheStrategy.ALL : 表示既緩存原始圖片,也緩存轉換過后的圖片损肛。
Glide和Picasso的區(qū)別
Glide是支持加載動態(tài)圖片的厢破。,Picasso是不會支持加載動態(tài)圖片的
相對于加載圖片Picasso比Glide開銷要大治拿,但是Picasso加載的圖片比Glide質量要好
原因在于Picasso是加載了全尺寸的圖片到內存摩泪,然后讓GPU來實時重繪大小。而Glide加載的大小和ImageView的大小是一致的劫谅,因此開銷小
Glide和Picasso都是非常完美的庫见坑。Glide加載圖像以及磁盤緩存的方式都要優(yōu)于Picasso,速度更快捏检,并且Glide更有利于減少OutOfMemoryError的發(fā)生荞驴,GIF動畫是Glide的殺手锏。不過Picasso的圖片質量更高
因為Glide默認的Bitmap格式是RGB_565 贯城,比PicassoARGB_8888格式的內存開銷要小一半