圖片加載庫 Picasso、Glide 、Fresco 比較

1、比較 Picasso 與 Glide

總體來說二者極為相似,有著近乎相同的 API 的使用風格,但 Glide 在緩存策略和加載 gif 方面略勝一籌。

基礎

Glide 和 Picasso 非常相似,Glide 加載圖片的方式和 Picasso 如出一轍。
雖然兩者看起來一樣,但 Glide 更易用,因為 Glide 的 with 方法不光接受 Context,還接受 Activity 和 Fragment,Context 會自動的從他們獲取,同時將 Activity/Fragment 作為 with()參數(shù)的好處是:圖片加載會和 Activity/Fragment 的生命周期保持一致,比如 Paused 狀態(tài)在暫停加載,在 Resumed 的時候又自動重新加載。

圖像和內(nèi)存

同樣將 1920×1080 像素的圖片加載到 768×432 的 ImageView 中,Glide 加載的圖片質(zhì)量要差于Picasso,這是因為 Glide 默認的 Bitmap 格式是 RGB-565 ,比 ARGB-8888 格式的內(nèi)存開銷要小一半。想要提高 Glide 的圖片效果,可以創(chuàng)建一個新的 GlideModule 將 Bitmap 格式轉(zhuǎn)換到 ARGB-8888。同時在 AndroidManifest.xml 中將 GlideModule 定義為 meta-data。
修改了 Bitmap 格式后,Glide 將花費兩倍于上次的內(nèi)存,但是仍遠遠小于 Picasso 的內(nèi)存開銷,原因在于 Picasso 是加載了全尺寸的圖片到內(nèi)存,然后讓 GPU 來實時重繪大小。而 Glide 加載的大小和 ImageView 的大小是一致的,當然,Picasso 也是可以指定加載圖片大小的,但是問題在于你需要主動計算 ImageView 的大小,或者說你的 ImageView 大小是具體的值(而不是 wrap_content )
在加載圖片這個問題上 Glide 完勝 Picasso,因為 Glide 可以自動計算出任意情況下的 ImageView 大小。

Image質(zhì)量的細節(jié)

將 ImageView 還原到真實大小時,Glide 加載的圖片沒有 Picasso 那么平滑。

磁盤緩存

Picasso 和 Glide 在磁盤緩存策略上有很大的不同。Picasso 緩存的是全尺寸的,而 Glide 緩存的是跟 ImageView 尺寸相同的。我們可以將 ImageView 調(diào)整成不同大小,但不管大小如何 Picasso 只緩存一個全尺寸的。Glide 則不同,它會為每種大小的 ImageView 緩存 一次。盡管一張圖片已經(jīng)緩存了一次,但是假如你要在另外一個地方再次以不同尺寸顯示,需要重新下載,調(diào)整成新尺寸的大小,然后將這個尺寸的也緩存起來。具體說來就是:假如在第一個頁面有一個 200×200 的 ImageView,在第二個頁面有一個 100×100 的 ImageView,這兩個 ImageView 本來是要顯示同一張圖片,卻需要下載兩次。不過,你可以通過代碼改變這種行為,讓Glide既緩存全尺寸又緩存其他尺寸,

這樣就使得下次在任何 ImageView 中加載圖片的時候,全尺寸的圖片將從緩存中取出,重新調(diào)整大小,然后緩存。
Glide 的這種方式優(yōu)點是加載顯示非??臁6?Picasso 的方式則因為需要在顯示之前重新調(diào)整大小而導致一些延遲。不過 Glide 比 Picasso 需要更大的空間來緩存。

特性

Glide 可以做到和 Picasso 幾乎一樣多的事,代碼也幾乎一樣。但 Glide 可以加載 GIF 動態(tài)圖,而 Picasso 不能,但是 Glide 動畫會消費太多的內(nèi)存,因此謹慎使用。除了 gif 動畫之外,Glide 還可以將任何的本地視頻解碼成一張靜態(tài)圖片。還有一個特性是你可以配置圖片顯示的動畫,而 Picasso 只有一種動畫:fading in,最后一個是可以使用 thumbnail()產(chǎn)生一個你所加載圖片的 thumbnail。其實還有一些特性,不過不是非常重要,比如將圖像轉(zhuǎn)換成字節(jié)數(shù)組等。

2、Fresco

內(nèi)存管理

Fresco 的最大亮點在于它的內(nèi)存管理。解壓后的圖片,即 Android 中的 Bitmap ,占用大量的內(nèi)存,在 Android 5.0以下系統(tǒng)中,這會顯著地引發(fā)界面卡頓。而使用 Fresco 將很好地解決這個問題,F(xiàn)resco 會將圖片放到一個特別的內(nèi)存區(qū)域,當圖片不再顯示的時候,占用的內(nèi)存會自動被釋放,這會使得 APP 更流暢,減少因圖片內(nèi)存占用而引發(fā)的 OOM。當 APP 包含的圖片較多時,這個效果尤其明顯。

圖像

Fresco 支持圖像的漸進式呈現(xiàn),漸進式的圖片格式先呈現(xiàn)大致的圖片輪廓,然后隨著圖片下載的繼續(xù),逐漸呈現(xiàn)清晰的圖片,這在低網(wǎng)速情況下瀏覽圖片十分有幫助,可以帶來更好地用戶體驗。另外,F(xiàn)resco 支持加載 gif 圖,支持 WebP 格式。

3、總結(jié)

ImageLoader 優(yōu)點
(1) 支持下載進度監(jiān)聽
(2) 可以在 View 滾動中暫停圖片加載

通過 PauseOnScrollListener 接口可以在 View 滾動中暫停圖片加載。

(3) 默認實現(xiàn)多種內(nèi)存緩存算法

這幾個圖片緩存都可以配置緩存算法,不過 ImageLoader 默認實現(xiàn)了較多緩存算法,如 Size 最大先刪除、使用最少先刪除、最近最少使用、先進先刪除、時間最長先刪除等。

(4) 支持本地緩存文件名規(guī)則定義
Picasso 優(yōu)點
(1) 自帶統(tǒng)計監(jiān)控功能

支持圖片緩存使用的監(jiān)控,包括緩存命中率、已使用內(nèi)存大小、節(jié)省的流量等。

(2) 支持優(yōu)先級處理

每次任務調(diào)度前會選擇優(yōu)先級高的任務,比如 App 頁面中 Banner 的優(yōu)先級高于 Icon 時就很適用。

(3) 支持延遲到圖片尺寸計算完成加載
(4) 支持飛行模式、并發(fā)線程數(shù)根據(jù)網(wǎng)絡類型而變

手機切換到飛行模式或網(wǎng)絡類型變換時會自動調(diào)整線程池最大并發(fā)數(shù),比如 wifi 最大并發(fā)為 4, 4g 為 3,3g 為 2。
這里 Picasso 根據(jù)網(wǎng)絡類型來決定最大并發(fā)數(shù),而不是 CPU 核數(shù)。

(5) “無”本地緩存

無”本地緩存,不是說沒有本地緩存,而是 Picasso 自己沒有實現(xiàn),交給了 Square 的另外一個網(wǎng)絡庫 okhttp 去實現(xiàn),這樣的好處是可以通過請求 Response Header 中的 Cache-Control 及 Expired 控制圖片的過期時間。

Glide 優(yōu)點
(1) 圖片緩存->媒體緩存

Glide 不僅是一個圖片緩存,它支持 Gif、WebP、縮略圖。甚至是 Video,所以更該當做一個媒體緩存。

(2) 支持優(yōu)先級處理

####### (3) 與 Activity/Fragment 生命周期一致,支持 trimMemory
Glide 對每個 context 都保持一個 RequestManager,通過 FragmentTransaction 保持與 Activity/Fragment 生命周期一致,并且有對應的 trimMemory 接口實現(xiàn)可供調(diào)用。

(4) 支持 okhttp、Volley

Glide 默認通過 UrlConnection 獲取數(shù)據(jù),可以配合 okhttp 或是 Volley 使用。實際 ImageLoader、Picasso 也都支持 okhttp、Volley。

(5) 內(nèi)存友好
① Glide 的內(nèi)存緩存有個 active 的設計

從內(nèi)存緩存中取數(shù)據(jù)時,不像一般的實現(xiàn)用 get,而是用 remove,再將這個緩存數(shù)據(jù)放到一個 value 為軟引用的 activeResources map 中,并計數(shù)引用數(shù),在圖片加載完成后進行判斷,如果引用計數(shù)為空則回收掉。

② 內(nèi)存緩存更小圖片

Glide 以 url、view_width、view_height、屏幕的分辨率等做為聯(lián)合 key,將處理后的圖片緩存在內(nèi)存緩存中,而不是原始圖片以節(jié)省大小

③ 與 Activity/Fragment 生命周期一致,支持 trimMemory
④ 圖片默認使用默認 RGB_565 而不是 ARGB_888

雖然清晰度差些,但圖片更小,也可配置到 ARGB_888。
其他:Glide 可以通過 signature 或不使用本地緩存支持 url 過期

Picasso 所能實現(xiàn)的功能 Glide 都能做到,只是所需設置不同。兩者的區(qū)別是 Picasso 比 Glide 體積小很多且圖像質(zhì)量比 Glide 高,但Glide 的速度比 Picasso 更快,Glide 的長處是處理大型的圖片流,如 gif、video,如果要制作視頻類應用,Glide 當為首選。
Fresco 可以說是綜合了之前圖片加載庫的優(yōu)點,其在5.0以下的內(nèi)存優(yōu)化非常好,但它的不足是體積太大,按體積進行比較:Fresco>Glide>Picasso,所以 Fresco 在圖片較多的應用中更能凸顯其價值,如果應用沒有太多圖片需求,不推薦使用 Fresco。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容