Fresco&Glide&Picasso 比較

Glide & Picasso

因為Glide和Picasso的api差不多,所以比較起來更容易一點,就先比較這兩個好了。

依賴

Glide

dependencies {
  compile 'com.github.bumptech.glide:glide:3.7.0'
  compile 'com.android.support:support-v4:19.1.0'
}

Picasso

dependencies {
  compile 'com.squareup.picasso:picasso:2.5.2'
}

別忘了Glide需要依賴Support Library v4。其實Support Library v4已經是應用程序的標配了,這不是什么問題。

使用

Glide

Glide.with(context)
    .load("http://inthecheesefactory.com/uploads/source/glidepicasso/cover.jpg")
    .into(ivImg);

Picasso

Picasso.with(context)
    .load("http://inthecheesefactory.com/uploads/source/glidepicasso/cover.jpg")
    .into(ivImg);

盡管它們看起來差不多,但是設計上Glide做得更好:因為Glide的with方法不光接受Context,還接受Activity 和 Fragment,Context會自動的從他們獲取。

比較

將Activity/Fragment傳給Glide的好處是:圖片加載會和Activity/Fragment的生命周期保持一致,比如Paused狀態在暫停加載,在Resumed的時候又自動重新加載。所以我建議傳參的時候傳遞Activity 和 Fragment給Glide,而不是Context。

默認加載格式 & 內存消耗

下面是將1920x1080的圖片加載進入768x432大小的ImageView的對比圖


Btmiap Format
Btmiap Format

Glide默認的Bitmap格式是RGB_565,比ARGB_8888的內存開銷要少50%。

下圖是Picasso和Glide的內存消耗比較圖(基礎的application就消耗了大概8MB)


memory
memory

當然Glide也是可以指定加載格式的:

public class GlideConfiguration implements GlideModule {

    @Override
    public void applyOptions(Context context, GlideBuilder builder) {
        // Apply options to the builder here.
        builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888);
    }

    @Override
    public void registerComponents(Context context, Glide glide) {
        // register ModelLoaders here.
    }
}

同時在AndroidManifest.xml中將GlideModule定義為meta-data

<meta-data android:name="com.name.GlideConfiguration"
            android:value="GlideModule"/>

在指定了Glide的加載格式之后,我們再來看看內存消耗的對比圖

memory
memory

可以看到,Picasso占用的內存依然比Glide大。這是因為Picasso加載的是完整的圖像(1920x1080)進入內存的。
而Glide是加載的真實ImageView(768x432)的大小進入內存的。
當然Picasso是可以調整加載圖像的大小:

Picasso.with(this)
    .load("http://nuuneoi.com/uploads/source/playstore/cover.jpg")
    .resize(768, 432)
    .into(ivImgPicasso);

當然,有時候你還無法明確的知道ImageView的大小,所以你還可以這么做:

Picasso.with(this)
    .load("http://nuuneoi.com/uploads/source/playstore/cover.jpg")
    .fit()
    .centerCrop()
    .into(ivImgPicasso);
memory
memory

緩存

Picasso和Glide在磁盤緩存策略上有很大的不同;Picasso緩存的是全尺寸的,而Glide緩存的是跟ImageView尺寸相同的。Glide的這種方式優點是在同樣大小的ImageView下加載顯示非常快。而Picasso的方式則因為需要在顯示之前重新調整大小而導致一些延遲。

Picasso只緩存一個全尺寸的。Glide則不同,它會為每種大小的ImageView緩存 一次。盡管一張圖片已經緩存了一次,但是假如你要在另外一個地方再次以不同尺寸顯示,需要重新下載,調整成新尺寸的大小,然后將這個尺寸的也緩存起來。
當然我們也可以讓Glide緩存完整的尺寸:

Glide.with(this)
     .load("http://nuuneoi.com/uploads/source/playstore/cover.jpg")
     .diskCacheStrategy(DiskCacheStrategy.ALL)
     .into(ivImgGlide);

下次在任何ImageView中加載圖片的時候,全尺寸的圖片將從緩存中取出,重新調整大小,然后緩存。

Glide比Picasso多的功能

Glide可以加載GIF動態圖,而Picasso不能。

還有一個特性是你可以配置圖片顯示的動畫,而Picasso只有一種動畫:fading in。

包大小

Picasso (v2.5.1)的大小約118kb,而Glide (v3.5.2)的大小約430kb。
Picasso和Glide的方法個數分別是840和2678個。

Fresco

關于Fresco

Fresco 中設計有一個叫做 Image Pipeline 的模塊。它負責從網絡,從本地文件系統,本地資源加載圖片。為了最大限度節省空間和CPU時間,它含有3級緩存設計(2級內存,1級磁盤)。

Fresco 中設計有一個叫做 Drawees 模塊,它會在圖片加載完成前顯示占位圖,加載成功后自動替換為目標圖片。當圖片不再顯示在屏幕上時,它會及時地釋放內存和空間占用。

特性

內存管理

解壓后的圖片,即Android中的Bitmap,占用大量的內存。大的內存占用勢必引發更加頻繁的GC。在5.0以下,GC將會顯著地引發界面卡頓。在5.0以下系統,Fresco將圖片放到一個特別的內存區域。當然,在圖片不顯示的時候,占用的內存會自動被釋放。這會使得APP更加流暢,減少因圖片內存占用而引發的OOM。Fresco 在低端機器上表現一樣出色,你再也不用因圖片內存占用而思前想后。

圖片加載

Fresco的Image Pipeline允許你用很多種方式來自定義圖片加載過程,比如:

  • 為同一個圖片指定不同的遠程路徑,或者使用已經存在本地緩存中的圖片
  • 先顯示一個低清晰度的圖片,等高清圖下載完之后再顯示高清圖
  • 加載完成回調通知
  • 對于本地圖,如有EXIF縮略圖,在大圖加載完成之前,可先顯示縮略圖
  • 縮放或者旋轉圖片
  • 對已下載的圖片再次處理
  • 支持WebP解碼,即使在早先對WebP支持不完善的Android系統上也能正常使用!

圖片繪制

Fresco 的 Drawees 設計,帶來一些有用的特性:

  • 自定義居中焦點
  • 圓角圖,當然圓圈也行
  • 下載失敗之后,點擊重現下載
  • 自定義占位圖,自定義overlay, 或者進度條
  • 指定用戶按壓時的overlay

漸進式呈現

漸進式的JPEG圖片格式已經流行數年了,漸進式圖片格式先呈現大致的圖片輪廓,然后隨著圖片下載的繼續,呈現逐漸清晰的圖片,這對于移動設備,尤其是慢網絡有極大的利好,可帶來更好的用戶體驗。

動圖加載

加載Gif圖和WebP動圖在任何一個Android開發者眼里看來都是一件非常頭疼的事情。每一幀都是一張很大的Bitmap,每一個動畫都有很多幀。Fresco讓你沒有這些煩惱,它處理好每一幀并管理好你的內存。

比較

以上說的都是一些Fresco的特性或者說強大的地方吧。但是它也有一些不是那么完美的地方:

包大小

Fresco > Glide > Picasso

操作

使用 DraweeView 時,請不要使用任何 ImageView 的屬性: 在后續的版本中,DraweeView 會直接從 View 派生。任何屬于 ImageView 但是不屬于 View 的方法都會被移除。

Drawee永遠會在getIntrinsicHeight/getIntrinsicWidth中返回-1。所以不能在xml中直接設置寬高為wrap_content

Fresco獲取Bitmap的操作比較麻煩

相關鏈接

Introduction to Glide, Image Loader Library for Android, recommended by Google

Fresco | 專為ANDROID加載圖片 | Fresco

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,763評論 6 539
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,238評論 3 428
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,823評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,604評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,339評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,713評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,712評論 3 445
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,893評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,448評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,201評論 3 357
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,397評論 1 372
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,944評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,631評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,033評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,321評論 1 293
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,128評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,347評論 2 377

推薦閱讀更多精彩內容