`Picasso與Glide弟疆、Fresco等開(kāi)源項(xiàng)目的不同特點(diǎn)和使用場(chǎng)景戚长,"他們之間有什么區(qū)別?"怠苔,“各自的特點(diǎn)是什么同廉?”。把這些問(wèn)題回答好了柑司,至少可以把你和拿來(lái)主義的競(jìng)爭(zhēng)者區(qū)分開(kāi)迫肖。
Android 三大圖片緩存原理、特性對(duì)比
Android 開(kāi)源圖片庫(kù)的選型及對(duì)比
Paste_Image.png
Universal Image Loader:一個(gè)強(qiáng)大的圖片加載庫(kù)攒驰,包含各種各樣的配置蟆湖,最老牌,使用也最廣泛玻粪。
Picasso: Square出品隅津,必屬精品。和OkHttp搭配起來(lái)更配呦劲室!
Volley ImageLoader:Google官方出品伦仍,可惜不能加載本地圖片~
Fresco:Facebook出的,天生驕傲很洋!不是一般的強(qiáng)大充蓝。
Glide:Google推薦的圖片加載庫(kù),專(zhuān)注于流暢的滾動(dòng)。
1.Picasso
應(yīng)用場(chǎng)景:小型化圖片數(shù)量少谓苟,非gif圖片官脓,
- 優(yōu)點(diǎn)
- 輕量化體積小,使用簡(jiǎn)單
(1) 自帶統(tǒng)計(jì)監(jiān)控功能支持圖片緩存使用的監(jiān)控娜谊,包括緩存命中率确买、已使用內(nèi)存大小、節(jié)省的流量等纱皆。
(2) 支持優(yōu)先級(jí)處理每次任務(wù)調(diào)度前會(huì)選擇優(yōu)先級(jí)高的任務(wù)湾趾,比如 App 頁(yè)面中 Banner 的優(yōu)先級(jí)高于 Icon 時(shí)就很適用。
(3) 支持延遲到圖片尺寸計(jì)算完成加載
(4) 支持飛行模式派草、并發(fā)線程數(shù)根據(jù)網(wǎng)絡(luò)類(lèi)型而變手機(jī)切換到飛行模式或網(wǎng)絡(luò)類(lèi)型變換時(shí)會(huì)自動(dòng)調(diào)整線程池最大并發(fā)數(shù)搀缠,比如 wifi 最大并發(fā)為 4, 4g 為 3近迁,3g 為 2艺普。這里 Picasso 根據(jù)網(wǎng)絡(luò)類(lèi)型來(lái)決定最大并發(fā)數(shù),而不是 CPU 核數(shù)鉴竭。
(5) “無(wú)”本地緩存無(wú)”本地緩存歧譬,不是說(shuō)沒(méi)有本地緩存,而是 Picasso 自己沒(méi)有實(shí)現(xiàn)搏存,交給了 Square 的另外一個(gè)網(wǎng)絡(luò)庫(kù) okhttp 去實(shí)現(xiàn)瑰步,這樣的好處是可以通過(guò)請(qǐng)求 Response Header 中的 Cache-Control 及 Expired 控制圖片的過(guò)期時(shí)間。
- 缺點(diǎn)
不能加載gif
2.Glide (Picasso的二次開(kāi)發(fā))
- 優(yōu)點(diǎn)
- 支持 Gif璧眠、WebP缩焦、縮略圖。甚至是 Video
而 Picasso 不能责静,但是 Glide 動(dòng)畫(huà)會(huì)消費(fèi)太多的內(nèi)存袁滥,因此謹(jǐn)慎使用。除了 gif 動(dòng)畫(huà)之外灾螃,Glide 還可以將任何的本地視頻解碼成一張靜態(tài)圖片题翻。還有一個(gè)特性是你可以配置圖片顯示的動(dòng)畫(huà),而 Picasso 只有一種動(dòng)畫(huà):fading in腰鬼,最后一個(gè)是可以使用 thumbnail()產(chǎn)生一個(gè)你所加載圖片的 thumbnail藐握。
- 相對(duì)于Picasso,Glide 的 with 方法不光接受 Context,還接受 Activity 和 Fragment
Context 會(huì)自動(dòng)的從他們獲取垃喊,同時(shí)將 Activity/Fragment 作為 with()參數(shù)的好處是:圖片加載會(huì)和 Activity/Fragment 的生命周期保持一致猾普,比如 Paused 狀態(tài)在暫停加載,在 Resumed 的時(shí)候又自動(dòng)重新加載本谜。 - 根據(jù)尺寸緩存初家,加載顯示非常快,但是需要大的緩存空間溜在。
Picasso 是加載了全尺寸的圖片到內(nèi)存陌知,然后讓 GPU 來(lái)實(shí)時(shí)重繪大小。而 Glide 加載的大小和 ImageView 的大小是一致的掖肋,當(dāng)然仆葡,Picasso 也是可以指定加載圖片大小的,但是問(wèn)題在于你需要主動(dòng)計(jì)算 ImageView 的大小志笼,或者說(shuō)你的 ImageView 大小是具體的值(而不是 wrap_content )在加載圖片這個(gè)問(wèn)題上 Glide 完勝 Picasso沿盅,因?yàn)?Glide 可以自動(dòng)計(jì)算出任意情況下的 ImageView 大小。(Glide更有利于減少OutOfMemoryError的發(fā)生)
**
- 缺點(diǎn)
- Glide 加載的圖片質(zhì)量要差于Picasso纫溃,這是因?yàn)?Glide 默認(rèn)的 Bitmap 格式是 RGB-565 腰涧,比 ARGB-8888 格式的內(nèi)存開(kāi)銷(xiāo)要小一半.補(bǔ)充:Glide可以設(shè)置Bitmap 格式轉(zhuǎn)換到 ARGB-8888
- Image質(zhì)量的細(xì)節(jié),將 ImageView 還原到真實(shí)大小時(shí)紊浩,Glide 加載的圖片沒(méi)有 Picasso 那么平滑窖铡。
3.Fresco
使用場(chǎng)景:圖片較多的應(yīng)用
- 優(yōu)點(diǎn)
- 最大亮點(diǎn)在于它的內(nèi)存管理。
解壓后的圖片,即 Android 中的 Bitmap 费彼,占用大量的內(nèi)存,在 Android 5.0以下系統(tǒng)中口芍,這會(huì)顯著地引發(fā)界面卡頓箍铲。而使用 Fresco 將很好地解決這個(gè)問(wèn)題祭玉,F(xiàn)resco 會(huì)將圖片放到一個(gè)特別的內(nèi)存區(qū)域(Ashmem 區(qū))氧映,當(dāng)圖片不再顯示的時(shí)候,占用的內(nèi)存會(huì)自動(dòng)被釋放脱货,這會(huì)使得 APP 更流暢岛都,減少因圖片內(nèi)存占用而引發(fā)的 OOM。當(dāng) APP 包含的圖片較多時(shí)振峻,這個(gè)效果尤其明顯臼疫。
- 支持流式,可以類(lèi)似網(wǎng)頁(yè)上模糊漸進(jìn)式顯示圖片
Fresco 支持圖像的漸進(jìn)式呈現(xiàn)扣孟,漸進(jìn)式的圖片格式先呈現(xiàn)大致的圖片輪廓烫堤,然后隨著圖片下載的繼續(xù),逐漸呈現(xiàn)清晰的圖片,這在低網(wǎng)速情況下瀏覽圖片十分有幫助鸽斟,可以帶來(lái)更好地用戶體驗(yàn)拔创。另外,F(xiàn)resco 支持加載 gif 圖富蓄,支持 WebP 格式剩燥。
- 缺點(diǎn)
- 體積太大
Fresco>Glide>Picasso,所以 Fresco 在圖片較多的應(yīng)用中更能凸顯其價(jià)值立倍,如果應(yīng)用沒(méi)有太多圖片需求灭红,不推薦使用 Fresco。
3.Universal Image Loader(2015年底停止維護(hù))
使用場(chǎng)景:圖片較多的應(yīng)用
- 優(yōu)點(diǎn)
- 支持下載進(jìn)度監(jiān)聽(tīng)
- 可以在view滾動(dòng)中暫停圖片加載 (通過(guò)pauseOnscrollListener接口可以在view滾動(dòng)中暫停圖片加載帐萎。)
- 默認(rèn)實(shí)現(xiàn)多種內(nèi)存緩沖