欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android圖片緩存原理、特性對(duì)比

 更新時(shí)間:2016年09月17日 08:49:06   作者:Wei_Leng  
這篇文章主要為大家詳細(xì)介紹了Android圖片緩存原理、特性對(duì)比 ,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

這是我在 MDCC 上分享的內(nèi)容(略微改動(dòng)),也是源碼解析第一期發(fā)布時(shí)介紹的源碼解析后續(xù)會(huì)慢慢做的事。

從總體設(shè)計(jì)和原理上對(duì)幾個(gè)圖片緩存進(jìn)行對(duì)比,沒(méi)用到他們的朋友也可以了解他們?cè)谀承┨匦陨系膶?shí)現(xiàn)。

一. 四大圖片緩存基本信息


Universal ImageLoader 是很早開(kāi)源的圖片緩存,在早期被很多應(yīng)用使用。

Picasso 是 Square 開(kāi)源的項(xiàng)目,且他的主導(dǎo)者是 JakeWharton,所以廣為人知。

Glide 是 Google 員工的開(kāi)源項(xiàng)目,被一些 Google App 使用,在去年的 Google I/O 上被推薦,不過(guò)目前國(guó)內(nèi)資料不多。

Fresco 是 Facebook 在今年上半年開(kāi)源的圖片緩存,主要特點(diǎn)包括:
(1) 兩個(gè)內(nèi)存緩存加上 Native 緩存構(gòu)成了三級(jí)緩存

(2) 支持流式,可以類(lèi)似網(wǎng)頁(yè)上模糊漸進(jìn)式顯示圖片

(3) 對(duì)多幀動(dòng)畫(huà)圖片支持更好,如 Gif、WebP

鑒于 Fresco 還沒(méi)發(fā)布正式的 1.0 版本,同時(shí)一直沒(méi)太多時(shí)間熟悉 Fresco 源碼,后面對(duì)比不包括 Fresco,以后有時(shí)間再加入對(duì)比。

更多圖片緩存庫(kù)可見(jiàn):Android 圖片緩存庫(kù)

二、基本概念

在正式對(duì)比前,先了解幾個(gè)圖片緩存通用的概念:
(1) RequestManager:請(qǐng)求生成和管理模塊

(2) Engine:引擎部分,負(fù)責(zé)創(chuàng)建任務(wù)(獲取數(shù)據(jù)),并調(diào)度執(zhí)行

(3) GetDataInterface:數(shù)據(jù)獲取接口,負(fù)責(zé)從各個(gè)數(shù)據(jù)源獲取數(shù)據(jù)。
比如 MemoryCache 從內(nèi)存緩存獲取數(shù)據(jù)、DiskCache 從本地緩存獲取數(shù)據(jù),下載器從網(wǎng)絡(luò)獲取數(shù)據(jù)等。

(4) Displayer:資源(圖片)顯示器,用于顯示或操作資源。
比如 ImageView,這幾個(gè)圖片緩存都不僅僅支持 ImageView,同時(shí)支持其他 View 以及虛擬的 Displayer 概念。

(5) Processor 資源(圖片)處理器
負(fù)責(zé)處理資源,比如旋轉(zhuǎn)、壓縮、截取等。

以上概念的稱呼在不同圖片緩存中可能不同,比如 Displayer 在 ImageLoader 中叫做 ImageAware,在 Picasso 和 Glide 中叫做 Target。

三、共同優(yōu)點(diǎn)

1. 使用簡(jiǎn)單
都可以通過(guò)一句代碼可實(shí)現(xiàn)圖片獲取和顯示。

2. 可配置度高,自適應(yīng)程度高
圖片緩存的下載器(重試機(jī)制)、解碼器、顯示器、處理器、內(nèi)存緩存、本地緩存、線程池、緩存算法等大都可輕松配置。

自適應(yīng)程度高,根據(jù)系統(tǒng)性能初始化緩存配置、系統(tǒng)信息變更后動(dòng)態(tài)調(diào)整策略。
比如根據(jù) CPU 核數(shù)確定最大并發(fā)數(shù),根據(jù)可用內(nèi)存確定內(nèi)存緩存大小,網(wǎng)絡(luò)狀態(tài)變化時(shí)調(diào)整最大并發(fā)數(shù)等。

3. 多級(jí)緩存
都至少有兩級(jí)緩存、提高圖片加載速度。 

4. 支持多種數(shù)據(jù)源
支持多種數(shù)據(jù)源,網(wǎng)絡(luò)、本地、資源、Assets 等

5. 支持多種 Displayer
不僅僅支持 ImageView,同時(shí)支持其他 View 以及虛擬的 Displayer 概念。

其他小的共同點(diǎn)包括支持動(dòng)畫(huà)、支持 transform 處理、獲取 EXIF 信息等。

四、ImageLoader 設(shè)計(jì)及優(yōu)點(diǎn)

1. 總體設(shè)計(jì)及流程

上面是 ImageLoader 的總體設(shè)計(jì)圖。整個(gè)庫(kù)分為 ImageLoaderEngine,Cache 及 ImageDownloader,ImageDecoder,BitmapDisplayer,BitmapProcessor 五大模塊,其中 Cache 分為 MemoryCache 和 DiskCache 兩部分。

簡(jiǎn)單的講就是 ImageLoader 收到加載及顯示圖片的任務(wù),并將它交給 ImageLoaderEngine,ImageLoaderEngine 分發(fā)任務(wù)到具體線程池去執(zhí)行,任務(wù)通過(guò) Cache 及 ImageDownloader 獲取圖片,中間可能經(jīng)過(guò) BitmapProcessor 和 ImageDecoder 處理,最終轉(zhuǎn)換為Bitmap 交給 BitmapDisplayer 在 ImageAware 中顯示。

2. ImageLoader 優(yōu)點(diǎn)

(1) 支持下載進(jìn)度監(jiān)聽(tīng)

(2) 可以在 View 滾動(dòng)中暫停圖片加載
通過(guò) PauseOnScrollListener 接口可以在 View 滾動(dòng)中暫停圖片加載。

(3) 默認(rèn)實(shí)現(xiàn)多種內(nèi)存緩存算法 這幾個(gè)圖片緩存都可以配置緩存算法,不過(guò) ImageLoader 默認(rèn)實(shí)現(xiàn)了較多緩存算法,如 Size 最大先刪除、使用最少先刪除、最近最少使用、先進(jìn)先刪除、時(shí)間最長(zhǎng)先刪除等。

(4) 支持本地緩存文件名規(guī)則定義

五、Picasso 設(shè)計(jì)及優(yōu)點(diǎn)

1. 總體設(shè)計(jì)及流程

上面是 Picasso 的總體設(shè)計(jì)圖。整個(gè)庫(kù)分為 Dispatcher,RequestHandler 及 Downloader,PicassoDrawable 等模塊。

Dispatcher 負(fù)責(zé)分發(fā)和處理 Action,包括提交、暫停、繼續(xù)、取消、網(wǎng)絡(luò)狀態(tài)變化、重試等等。

簡(jiǎn)單的講就是 Picasso 收到加載及顯示圖片的任務(wù),創(chuàng)建 Request 并將它交給 Dispatcher,Dispatcher 分發(fā)任務(wù)到具體 RequestHandler,任務(wù)通過(guò) MemoryCache 及 Handler(數(shù)據(jù)獲取接口) 獲取圖片,圖片獲取成功后通過(guò) PicassoDrawable 顯示到 Target 中。

需要注意的是上面 Data 的 File system 部分,Picasso 沒(méi)有自定義本地緩存的接口,默認(rèn)使用 http 的本地緩存,API 9 以上使用 okhttp,以下使用 Urlconnection,所以如果需要自定義本地緩存就需要重定義 Downloader。

2. Picasso 優(yōu)點(diǎ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í)間。

六、Glide 設(shè)計(jì)及優(yōu)點(diǎn)

1. 總體設(shè)計(jì)及流程

上面是 Glide 的總體設(shè)計(jì)圖。整個(gè)庫(kù)分為 RequestManager(請(qǐng)求管理器),Engine(數(shù)據(jù)獲取引擎)、 Fetcher(數(shù)據(jù)獲取器)、MemoryCache(內(nèi)存緩存)、DiskLRUCache、Transformation(圖片處理)、Encoder(本地緩存存儲(chǔ))、Registry(圖片類(lèi)型及解析器配置)、Target(目標(biāo)) 等模塊。

簡(jiǎn)單的講就是 Glide 收到加載及顯示資源的任務(wù),創(chuàng)建 Request 并將它交給RequestManager,Request 啟動(dòng) Engine 去數(shù)據(jù)源獲取資源(通過(guò) Fetcher ),獲取到后 Transformation 處理后交給 Target。

Glide 依賴于 DiskLRUCache、GifDecoder 等開(kāi)源庫(kù)去完成本地緩存和 Gif 圖片解碼工作。

2. Glide 優(yōu)點(diǎn)

(1) 圖片緩存->媒體緩存
Glide 不僅是一個(gè)圖片緩存,它支持 Gif、WebP、縮略圖。甚至是 Video,所以更該當(dāng)做一個(gè)媒體緩存。 

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

(3) 與 Activity/Fragment 生命周期一致,支持 trimMemory
Glide 對(duì)每個(gè) context 都保持一個(gè) RequestManager,通過(guò) FragmentTransaction 保持與 Activity/Fragment 生命周期一致,并且有對(duì)應(yīng)的 trimMemory 接口實(shí)現(xiàn)可供調(diào)用。

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

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

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

③ 與 Activity/Fragment 生命周期一致,支持 trimMemory

④ 圖片默認(rèn)使用默認(rèn) RGB_565 而不是 ARGB_888
雖然清晰度差些,但圖片更小,也可配置到 ARGB_888。

其他:Glide 可以通過(guò) signature 或不使用本地緩存支持 url 過(guò)期

七、匯總


三者總體上來(lái)說(shuō),ImageLoader 的功能以及代理容易理解長(zhǎng)度都一般。 

Picasso 代碼雖然只在一個(gè)包下,沒(méi)有嚴(yán)格的包區(qū)分,但代碼簡(jiǎn)單、邏輯清晰,一兩個(gè)小時(shí)就能叫深入的了解完。

Glide 功能強(qiáng)大,但代碼量大、流轉(zhuǎn)復(fù)雜。在較深掌握的情況下才推薦使用,免得出了問(wèn)題難以下手解決。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 如何利用Flutter仿寫(xiě)微信搜索頁(yè)效果

    如何利用Flutter仿寫(xiě)微信搜索頁(yè)效果

    這篇文章主要給大家介紹了關(guān)于如何利用Flutter仿寫(xiě)微信搜索頁(yè)效果的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2022-01-01
  • android和js的交互之jsbridge使用教程

    android和js的交互之jsbridge使用教程

    這篇文章主要給大家介紹了關(guān)于android和js的交互之jsbridge使用的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-04-04
  • Android遠(yuǎn)程獲取圖片并本地緩存

    Android遠(yuǎn)程獲取圖片并本地緩存

    這篇文章主要介紹了Android遠(yuǎn)程獲取圖片并本地緩存方法,對(duì)于遠(yuǎn)程圖片等相對(duì)比較大的資源采用異步線程中去獲取本地做緩存,感興趣的小伙伴們可以參考一下
    2016-02-02
  • Android實(shí)現(xiàn)指定時(shí)間定時(shí)觸發(fā)方法

    Android實(shí)現(xiàn)指定時(shí)間定時(shí)觸發(fā)方法

    這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)指定時(shí)間定時(shí)觸發(fā)方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • Android編程實(shí)現(xiàn)加載等待ProgressDialog的方法

    Android編程實(shí)現(xiàn)加載等待ProgressDialog的方法

    這篇文章主要介紹了Android編程實(shí)現(xiàn)加載等待ProgressDialog的方法,實(shí)例分析了Android中加載等待類(lèi)ProgressDialog的具體使用方法,需要的朋友可以參考下
    2015-12-12
  • Android控件之TabHost用法實(shí)例分析

    Android控件之TabHost用法實(shí)例分析

    這篇文章主要介紹了Android控件之TabHost用法,以完整實(shí)例形式較為詳細(xì)的分析了TabHost控件實(shí)現(xiàn)選項(xiàng)卡的相關(guān)技巧,需要的朋友可以參考下
    2015-09-09
  • Android-實(shí)現(xiàn)切換Fragment頁(yè)功能的實(shí)現(xiàn)代碼

    Android-實(shí)現(xiàn)切換Fragment頁(yè)功能的實(shí)現(xiàn)代碼

    本篇文章主要介紹了Android-實(shí)現(xiàn)切換Fragment頁(yè)功能的實(shí)現(xiàn)代碼,具有一定的參加價(jià)值,有興趣的可以了解一下。
    2017-02-02
  • Android UI組件AppWidget控件入門(mén)詳解

    Android UI組件AppWidget控件入門(mén)詳解

    這篇文章主要介紹了Android UI組件AppWidget控件入門(mén),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-09-09
  • Android編程設(shè)計(jì)模式之狀態(tài)模式詳解

    Android編程設(shè)計(jì)模式之狀態(tài)模式詳解

    這篇文章主要介紹了Android編程設(shè)計(jì)模式之狀態(tài)模式,結(jié)合實(shí)例形式詳細(xì)分析了Android狀態(tài)模式的概念、功能、使用方法及相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2017-12-12
  • Android 百分比布局詳解及實(shí)例代碼

    Android 百分比布局詳解及實(shí)例代碼

    這篇文章主要介紹了Android 百分比布局詳解及實(shí)例代碼的相關(guān)資料,這里附有代碼實(shí)例幫助大家學(xué)習(xí)參考,如何實(shí)現(xiàn)百分比布局,需要的朋友可以參考下
    2016-11-11

最新評(píng)論