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

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 的子類基本都是繼承上述方法做一些差異化的操作,就不一一介紹了。

Action及其子類

Action內部方法列表
第三部分Cache:
簡介:使用鍵值對儲存<url,Bitmap>.
get()、set()方法主要是存取操作
size()目前佔用記憶體大小
maxsize():設定最大佔用大小
clear():清除所有Bitmap
clearKeyUri():根據url清除Bitmap
LruCache實現了Cache的所有方法。

Cache所有方法
第四部分 Downloader:
簡介: 下載圖片的部分,此部分主要是封裝一下okhttp的下載功能。
Downloader只有兩個方法:load()和shutdown(),很好理解:載入和關閉。
我們再來看看其實現類OkHttp3Downloader:
不同的初始化引數,
可以選擇本地載入,
也可以選擇網路載入,網路載入還配有配置OkHttpclient
load()方法就是呼叫okhttp去下載圖片,然後返回Response

Downloader

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

Policy
第六部分 Request:
簡介:Request主要就是組織請求的引數,包括圖片顯示大小,ScaleType、旋轉角度、移動距離、URI、resourceId等引數。
RequestCreator是Request的輔助類,主要是配置Request.Buider的引數
DeferredRequestCreator是在圖片draw之前做的一些操作或者跟window的attached或者unattached狀態監聽

Request模組

Request

RequestCreator

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

RequestHandler模組

RequestHandler

ResourceRequestHandler
第八部分 Stats:
簡介:
統計的一些資訊。比如說查詢圖片Hit多少次,Miss多少次,Decode多少次、
Transform多少次,以及下載多少次等統計資訊。再次不再進行過多介紹

Stats
第九部分 Utils:
簡介:工具類,都是具體業務方面的實現,有興趣自己檢視即可。
第十部分 Picasso:
簡介:封裝了所有業務,也是對外的主要入口。

Picasso
未完待續,有時間有心情就續,沒時間就算了
相關文章
- 圖片載入框架Picasso - 原始碼分析框架原始碼
- Android圖片載入框架Picasso原始碼分析(基於Picasso 2.71828)Android框架原始碼
- 影片直播原始碼,載入gif圖片原始碼
- Android 圖片載入框架Android框架
- picasso框架框架
- Picasso-原始碼解析(三)原始碼
- Picasso-原始碼解析(一)原始碼
- Picasso-原始碼解析(二)原始碼
- 小說APP原始碼的圖片載入方式,懶載入和預載入的實現APP原始碼
- Android:這是一份全面 & 詳細的圖片載入庫Glide原始碼分析AndroidIDE原始碼
- Android圖片載入框架Fresco使用詳解Android框架
- 如何實現一個圖片載入框架框架
- Glide 原始碼分析(一):圖片壓縮IDE原始碼
- 圖片下載框架概述框架
- ThinkPHP5.1.x 框架原始碼分析 (三) [框架的靈魂] - Composer 自動載入PHP框架原始碼
- 圖片懶載入
- 圖片載入事件事件
- 預載入圖片
- Flutter 圖片載入Flutter
- 直播app原始碼,js圖片下載方式集合APP原始碼JS
- 圖片預載入和懶載入
- Springboot 載入配置檔案原始碼分析Spring Boot原始碼
- 開源框架——圖片載入和快取方案總結框架快取
- 載入本地圖片模糊,Glide載入網路圖片卻很清晰地圖IDE
- TestFlight下載App,載入圖片失效。Xcode安裝App,圖片載入正常。APPXCode
- 遊戲陪玩原始碼前端圖片載入優化的各種技巧遊戲原始碼前端優化
- 視訊直播app原始碼,Android RecyclerView 列表載入圖片寬高適配APP原始碼AndroidView
- MJRefresh原始碼框架分析原始碼框架
- ThinkPHP5.1.x 框架原始碼分析 (一) [框架的靈魂] - 類的自動載入初始PHP框架原始碼
- 圖片懶載入(IntersectionObserver)Server
- glide圖片載入原理IDE
- 圖片懶載入原理
- 載入遠端圖片
- 精盡Spring Boot原始碼分析 - 配置載入Spring Boot原始碼
- 從零開始打造一個iOS圖片載入框架(一)iOS框架
- 從零開始打造一個iOS圖片載入框架(三)iOS框架
- 從零開始打造一個iOS圖片載入框架(四)iOS框架
- 從零開始打造一個iOS圖片載入框架(二)iOS框架