Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android資訊 >> Android圖片加載庫Picasso源碼分析

Android圖片加載庫Picasso源碼分析

編輯:Android資訊

圖片加載在Android開發中是非常重要,好的圖片加載庫也比比皆是。ImageLoader、Picasso、Glide、Fresco均是優秀的圖片加載庫。

以上提到的幾種圖片加載庫各有特色。用法與比較,網上已經很多了。

出於學習的角度,個人認為從Picasso入手較好。代碼量小,同時API優美,很適合我們學習。

今天筆者就Picasso的源碼進行分析,拋出一些圖片加載的技術細節供園友參考。

PS:建議園友先大致看一下源碼。

我們對圖片加載的要求

1.加載速度要快

2.資源消耗要低

3.加載圖片不能錯位

Picasso是否滿足要求?

加載速度要快

1.標配策略,MemoryCache+DiskCache+Net。提高加載速度,同時保證流量。

2.Net部分,兼顧單請求加載速度與多請求並發能力,從而提高整體加載速度。

3.MemoryCache部分,通過Lru策略提高緩存效率。

資源消耗要低

1.渲染適當尺寸圖片來減少內存。

2.通過線程池來限制並發的圖片加載線程,降低資源消耗。

3.請求相同圖片的線程要合並,減少線程數。

加載圖片不能錯位

AdapterView會 復用 View,Picasso通過Map<ImageView,Action>機制保證View展示正確的圖。

可見,Picasso已經滿足了我們對圖片加載的需求。

Picasso的一些基本策略

緩存策略 MemoryCache+DiskCache+Net

1.MemoryCache采用的是Lru策略,持有一定數量處理過的圖(譬如經過resize/rotate處理,可直接設置到view中)。

2.DiskCache是網絡圖片在本地的緩存,緩存的是原圖,可能需要經過處理才能設置到view中。

3.Net是圖片服務器,當MemoryCache和DiskCache均取不到圖片時,網絡拉取,成本最高。

圖片錯位

為了保證圖片不會錯位,Picasso維護了Map<ImageView,Action>,每個ImageView均只對應一個Action。

若獲取的圖片Action與ImageView不符合,則丟棄,等待正確的Action執行完。

性能

1.Picasso的線程池是優化過的,根據當前設備網絡狀況設置ThreadCount。

在網絡良好的條件下,線程池持有較多線程,保證下載速度夠快。在網絡較差的條件下(2G網絡等),線程池減少持有線程,保證帶寬不會被多個連接阻塞。

2.Picasso將圖片uri、resize、transform等參數糅合為key,將key封裝到Action中進行請求。

請求線程Hunter對相同key的Action進行合並,請求完成後,Action依次得到圖片。

以上是Picasso的一些基本策略,可能看不太懂,接下來結合 Picasso加載ImageView圖片的場景 來串一下流程。

流程與源碼分析

實例化

picasso的實例化有兩種方式

1.Picasso.with(context)

此方法提供默認方式,生成單例的Picasso對象。

2.new Picasso.Builder(context).build()

此方式提供自定義線程池、緩存、下載器等方法。

獲取RequestCreator

picasso作為圖片加載庫,作用便是下載圖片。我們拿到picasso實例後,正常思路便是調用picasso.load()。

load()有四個方法,參數各不相同,不過可以分為兩類:uri和resourceId。uri又分為file和net。

load()的返回結果是RequestCreator對象,RequestCreator是用來配置加載參數的。

RequestCreator

RequestCreator有兩個功能

1.配置加載參數。

包括placeHolder與error圖片,加載圖片的大小、旋轉、居中等屬性。

2.執行加載。

通過調用into(object)方法進行加載。

into方法主流程梳理如下

Android圖片加載庫Picasso源碼分析

後續的工作就交由Hunter來處理了

備注1:(imageview,action)是用來保證imageview與正確action匹配的。

備注2:hunterMap通過key持有多個hunter,同一個hunter可以對應多個action

Hunter

hunter是一個Runnable,作用是獲取圖片。

hunter的執行流程:在run()方法中執行hunt()方法嘗試獲取圖片,結果(成功、失敗、異常)交給Dispatcher回調。

hunter的基礎類是BitmapHunter,但它卻是一個模版類,最重要的decode(request)方法交由子類來實現。

hunt()方法主流程梳理如下:

Android圖片加載庫Picasso源碼分析

Dispatcher

Dispatcher是分發器,由Picasso或Hunter來調用。

Picasso或BitmapHunter只能調用dispatcher**()方法。

原因是不能確定是main線程或Hunter線程在調用,所以Dispatcher索性對所有的調用均經過Dispatcher轉發,轉發後調用perform**()方法,這樣即可保證在main線程中操作事件。

API如下:

dispatcherSubmit()和dispatcherCancel()

hunter中加入action便調用dispatcherSubmit(),hunter中取消action便調用dispatcherCancel()

dispatcherComplete()和dispatcherError()

加載結束時調用。均調用batch方法,不過complete操作會將bitmap加入到cache中,以便後續調用。

batch()

起緩沖作用,每隔0.2s執行一次performBatchComplete()批處理。批處理將hunterList回調給Picasso,Picasso對每個hunter的每個action進行結果回調。

其他

跟隨ImageView的圖片加載,應該對Picasso的源碼已經有了一定了解。但是還有幾個相對獨立的模塊沒有涉及到,園友們直接閱讀源碼即可。

downloader提供了UrlConnection和OKHttp兩種方案,優先選用OKHttp。主要添加了httpCache。

Stats主要用於數據統計,很獨立的模塊。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved