圖片載入框架Picasso原始碼分析

weixin_34208283發表於2019-01-21

第一部分:程式碼整理

最初始程式碼是全部放在一個目錄裡,我根據功能把其分成不同的模組。
每個模組只要研究明白1個類檔案就足夠明白框架做的事情了。
最後再整合一下,整個框架就非常容易明白了,先來看一下分模組後的目錄,然後從上到下逐個模組分析:
1494999-272199fa3b8c51ed.png
Picasso模組劃分

第二部分Action:

主要使用場景:圖片載入成功或者失敗後呼叫。
Action(Picasso,Request ,......):傳入 大量引數進行初始化

onComplete(): 圖片載入成功後呼叫的方法,一般是用給ImageView新增載入成功後的圖片。

error():圖片載入失敗後呼叫的方法,一般用來給ImageView設定載入錯誤時的圖片。

cancel():取消載入圖片的方法

getTarget():主要就是返回Target,Target類在最後再介紹。

getRequest(): 返回Request物件,Request主要儲存請求相關的引數。在request模組再詳細介紹。

getKey():返回key
isCancelled():是否取消
willReplay():載入失敗後是否重新載入

getMemoryPolicy():獲取記憶體載入策略,在policy模組詳細介紹
getNetworkPolicy():獲取網路載入策略,在policy模組詳細介紹

getPicasso():獲取Picasso物件

Action 的子類基本都是繼承上述方法做一些差異化的操作,就不一一介紹了。
1494999-c75417c2eea06099.png
Action及其子類
1494999-4a6c255159ec354b.png
Action內部方法列表

第三部分Cache:

簡介:使用鍵值對儲存<url,Bitmap>.

get()、set()方法主要是存取操作
size()目前佔用記憶體大小
maxsize():設定最大佔用大小
clear():清除所有Bitmap
clearKeyUri():根據url清除Bitmap

LruCache實現了Cache的所有方法。


1494999-afadb7efcbaa2efd.png
Cache所有方法

第四部分 Downloader:

 簡介: 下載圖片的部分,此部分主要是封裝一下okhttp的下載功能。

Downloader只有兩個方法:load()和shutdown(),很好理解:載入和關閉。

我們再來看看其實現類OkHttp3Downloader:
  不同的初始化引數,
      可以選擇本地載入,
      也可以選擇網路載入,網路載入還配有配置OkHttpclient
  load()方法就是呼叫okhttp去下載圖片,然後返回Response
1494999-d09270208bc9f551.png
Downloader

1494999-4d2c6102215f2710.png
OkHttp3Downloader

第五部分 Policy:

簡介:此部分主要介紹載入的策略,包括網路載入和記憶體載入。
NetworkPolicy方法如下圖:
    shouldReadFromDiskCache():是否應該從硬碟讀
    shouldWriteToDiskCache():是否應該從硬碟寫
MemoryPolicy:
    和NetworkPolicy類似,把硬碟改成記憶體而已。
      是否從記憶體讀
      是否往記憶體寫。
1494999-0338ca943c874f7b.png
Policy

第六部分 Request:

簡介:Request主要就是組織請求的引數,包括圖片顯示大小,ScaleType、旋轉角度、移動距離、URI、resourceId等引數。

    RequestCreator是Request的輔助類,主要是配置Request.Buider的引數

  DeferredRequestCreator是在圖片draw之前做的一些操作或者跟window的attached或者unattached狀態監聽
1494999-909ef6cd31e9ba18.png
Request模組
1494999-5bd61fb47eca74a3.png
Request

1494999-4c63ca7f95d15027.png
RequestCreator

1494999-4014094bfb8857bd.png
DeferredRequestCreator

第七部分 RequestHandler:
介紹:載入不同路徑的圖片資源的不同處理方式。
父類RequestHandler:load()載入圖片,一起重試,計算縮放等方法。
其他類都是子類,方法基本一樣,實現方式不同。例如ResourceRequestHandler,載入resource資源,返回Result具體方法如下圖所示:

1494999-d13eac68fff8f047.png
RequestHandler模組
1494999-ea6db8c840963b3d.png
RequestHandler
1494999-12d5de2e124061c4.png
ResourceRequestHandler

第八部分 Stats:

簡介:
  統計的一些資訊。比如說查詢圖片Hit多少次,Miss多少次,Decode多少次、
  Transform多少次,以及下載多少次等統計資訊。再次不再進行過多介紹
1494999-c7b38974f15e4838.png
Stats

第九部分 Utils:

簡介:工具類,都是具體業務方面的實現,有興趣自己檢視即可。

第十部分 Picasso:

  簡介:封裝了所有業務,也是對外的主要入口。
1494999-3ac93982846d2be8.png
Picasso

未完待續,有時間有心情就續,沒時間就算了

相關文章