1. 程式人生 > >常用圖片載入框架比較(Glide、volley、Picasso)

常用圖片載入框架比較(Glide、volley、Picasso)

             Volley                      一、ImageRequest:                                    來對網路圖片進行請求,放入請求佇列,獲取後現在在控制元件上面                            步驟:                                    建立請求佇列mQueue;                               建立ImageRequest 請求,並進行配置,並將請求放入請求佇列mqueue中去;                               ImageRequest只有一個構造方法:對圖片大小和圖片格式進行設定;
                          原理:                                    拿到要請求的URL,去快取中遍歷,是否已存在要請求的資源;mCache.getBitmap()                                        是                                            從快取中取出請求                                            得到快取中取出需要的請求結果                                                是
                                                    解析結果                                                    返回結果到主執行緒(mDelivery.postResponse())                                                否                                                    結果為null或者快取過期                                                    新增到網路請求佇列
                                        否                                            進行網路請求(MakeImageRequest)                                                從網路請求佇列中取出具體的請求                                                進行請求                                                解析網路請求                                                是否快取                                                    是:                                                        新增到快取                                                    否:                                                        返回結果到主執行緒(mDelivery.postResponse())                        二、ImageLoader                                      ImageLoader也可以用於載入網路上的圖片,並且它的內部也是使用ImageRequest來實現的,                                      ImageLoader明顯要比ImageRequest更加高效,因為它不僅可以幫我們對圖片進行快取,還可以過濾掉重複的連結,避免重複傳送請求。                                 步驟:                                        1,建立請求佇列;                                   2,建立imageloader物件,其中imageloader的構造方法第二個引數為imageCache的實現類,實現圖片快取的演算法類。                                   3,建立imagelistener物件,主要設定圖片載入失敗和載入過程中的圖片設定。                        三、NetworkImageView                                      是一個自定義控制元件,它是繼承自ImageView的,具備ImageView控制元件的所有功能,並且在原生的基礎之上加入了載入網路圖片的功能。                                步驟:                                        1. 建立一個RequestQueue物件。                                        2. 建立一個ImageLoader物件。                                        3. 在佈局檔案中新增一個NetworkImageView控制元件。                                        4. 在程式碼中獲取該控制元件的例項。                                        5. 設定要載入的圖片地址。                                    由於NetworkImageView是一個控制元件,在載入圖片的時候它會自動獲取自身的寬高,然後對比網路圖片的寬度,再決定是否需要對圖片進行壓縮。                                    它的壓縮過程是在內部完全自動化的,它會始終呈現給我們一張大小剛剛好的網路圖片,不會多佔用任何一點記憶體。                                    如果你不想對圖片進行壓縮,只需要在佈局檔案中把NetworkImageView的layout_width和layout_height都設定成wrap_content就可以了,這                                    樣NetworkImageView就會將該圖片的原始大小展示出來,不會進行任何壓縮。            Picasso                    定義:                            Picasso是Square公司開源的一個Android圖形快取庫,可以實現圖片下載和快取功能.                            採用鏈式呼叫的方式。                    原理:                            接收到載入和顯示圖片的任務                            建立Request,並交給dispatcher進行處理(BitmapHunter)                            Dispatcher分發任務到具體的RequestHandler                                    ResourceRequesthandler                                    FileRequestHandler                                    NetWorkRequestHandler                            任務通過MemoryCache及Handler(資料獲取介面) 來獲取圖片                            圖片獲取成功後通過PicassoDrawable顯示到Target(ImageView)中。                    優點:                            不僅實現了圖片非同步載入的功能,還解決了android中載入圖片時需要解決的一些常見問題:                                   1.解決了在adapter中需要取消已經不在視野範圍的ImageView圖片資源的載入,否則會導致圖片錯位的這個問題;                                   2.使用最少的記憶體完成複雜的圖片轉換,比如把下載的圖片轉換為圓角等;                                   3.自帶記憶體和硬碟二級快取功能;                                   4.從不同資源進行載入(網路、本地、assests、資源)                                   5.支援優先順序處理                    缺點:                            功能較簡單---圖片載入                            效能(載入速度)比別的庫慢(Glide、Fresco)                            自身實現本地無快取            Glide                    介紹:                             Glide 是一個高效、開源、Android裝置上的媒體管理框架,它遵循BSD、MIT以及Apache 2.0協議釋出。預設使用httpurlconnection作為網路請求模組;                             Glide具有獲取、解碼和展示視訊劇照、圖片、動畫等功能,它還有靈活的API,這些API使開發者能夠將Glide應用在幾乎任何網路協議棧裡。                             建立Glide的主要目的:                                     一個是實現平滑的圖片列表滾動效果;                                     一個是支援遠端圖片的獲取、大小調整和展示。如背景圖片的載入、記憶體和磁碟間的高效快取、使用點陣圖和資源池提高載入效能。                    特點:                            GIF動畫的解碼:                                 通過呼叫Glide.with(context).load(“圖片路徑“)方法,GIF動畫圖片可以自動顯示為動畫效果。如果想有更多的控制,還可以使用Glide.with(context).load(“圖片路徑“).asBitmap()方法載入靜態圖片,使用Glide.with(context).load(“圖片路徑“).asGif()方法載入動畫圖片;                            本地視訊劇照的解碼:                                通過呼叫Glide.with(context).load(“圖片路徑“)方法,Glide能夠支援Android裝置中的所有視訊劇照的載入和展示                            縮圖的支援:                                為了減少在同一個view元件裡同時載入多張圖片的時間,可以呼叫Glide.with(context).load(“圖片路徑“).thumbnail(“縮略比例“).into(“view元件“)方法                                載入一個縮圖,還可以控制thumbnail()中的引數的大小,以控制顯示不同比例大小的縮圖。                            Activity生命週期的整合:                                當Activity暫停和重啟時,Glide能夠做到智慧的暫停和重新開始請求,並且當Android裝置的連線狀態變化時,所有失敗的請求能夠自動重新請求。                                原因:
glide需要知道activity的生命週期,在Glide.with( ) 方法中,向當前的Activity當中新增一個隱藏的Fragment。通過fragment來監聽activity生命週期的變化。 因為Fragment的生命週期和Activity是同步的,如果Activity被銷燬了,Fragment是可以監聽到的,這樣Glide就可以捕獲這個事件並停止圖片載入了。
                            轉碼的支援:                                Glide的toBytes() 和transcode() 兩個方法可以用來獲取、解碼和變換背景圖片,並且transcode() 方法還能夠改變圖片的樣式                            動畫的支援:                                新增支援圖片的淡入淡出動畫效果(呼叫crossFade()方法)和檢視動畫的屬性的功能。                            OkHttp和Volley的支援:                                預設選擇HttpUrlConnection作為網路協議棧,還可以選擇OkHttp和Volley作為網路協議棧                            其他功能:                                如在圖片載入過程中,使用Drawables物件作為佔位符、圖片請求的優化、圖片的寬度和高度可重新設定、縮圖和原圖的快取等功能                   設計流程:                         Glide收到載入及顯示資源的任務                         建立Request並將它交給RequestManager(工作管理員)                             singleRequest                             ThumbnailRequestCoordinatior                         Request啟動Engine(資料獲取引擎)去資料來源獲取資源                             通過Fetcher獲取資料                                     LocalURIFetcher                                     OkhttpStreamFetcher                             通過快取獲取資料                                     MemoryCache                         獲取到後Transformation(圖片處理)處理後,回撥交給Target(目標)進行圖片顯示                                                快取策略:( 記憶體–>磁碟–>網路                         記憶體快取
                                Glide預設是會在記憶體中快取處理圖(RESULT)的。(isCacheable = true)
記憶體快取最大空間(maxSize)=每個程序可用的最大記憶體 * 0.4                         磁碟快取                                                                    Glide磁碟快取策略分為四種,預設的是RESULT。磁碟快取大小: 250 * 1024 * 1024(250MB)                            1.ALL:快取原圖(SOURCE)和處理圖(RESULT)                            2.NONE:什麼都不快取                            3.SOURCE:只快取原圖(SOURCE)                                   4.RESULT:只快取處理圖(RESULT)—預設值 清除快取:                                        清除所有記憶體快取(需要在Ui執行緒操作)                    Glide.get(this).clearMemory();                                        清除所有磁碟快取(需要在子執行緒操作)                          Glide.get(MainActivity.this).clearDiskCache();        總結比較:            Glide和Picasso都是非常完美的庫。            Picasso:                    和Square的網路庫一起能發揮最大作用,因為Picasso可以選擇將網路請求的快取部分交給了okhttp實現。            Glide:                    模仿了Picasso的API,而且在他的基礎上加了很多的擴充套件(比如gif等支援),Glide預設的Bitmap格式是RGB_565,                            比Picasso預設的ARGB_8888格式的記憶體開銷要小一半;                    Picasso快取的是全尺寸的(只快取一種),而Glide快取的是跟ImageView尺寸相同的(即56*56和128*128是兩個快取) 。            比較:                     Glide載入影象以及磁碟快取的方式都要優於Picasso,速度更快,並且Glide更有利於減少OutOfMemoryError的發生,GIF動畫是Glide的殺手鐗。                     不過Picasso的圖片質量更高。我的建議是使用Glide,但是將Bitmap格式換成ARGB_8888、讓Glide快取同時快取全尺寸和改變尺寸兩種。                     Picasso所能實現的功能,Glide都能做,無非是所需的設定不同。                     但是Picasso體積比起Glide小太多如果專案中網路請求本身用的就是okhttp或者retrofit(本質還是okhttp),那麼建議用Picasso,                     體積會小很多(Square全家桶的幹活)。                     Glide的好處是大型的圖片流,比如gif、Video,如果你們是做美拍、愛拍這種視訊類應用,建議使用。