本文參考
https://github.com/facebook/fresco
https://juejin.im/post/5a7568825188257a7a2d9ddb
概述
近期使用到fresco,各要點總結記錄下。本文內容多爲轉載或翻譯。
官方描述特點
fresco官方的描述中主要有以下幾個特點:
- 原生的bitmap在被渲染出來後,native的資源就會被回收。這個操作是在UI線程進行的,因此會造成卡頓。
fresco中bitmap在被渲染出來後不自動回收native資源,由fresco框架來控制回收時機。 - Bitmap解碼是非常消耗CPU資源的,當消耗過大時會引起UI阻塞。
在fresco中就對解碼後的bitmap進行了緩存,避免解碼造成UI卡頓。
關鍵類
DraweeView:繼承於ImageView,只是簡單的讀取xml文件的一些屬性值和做一些初始化的工作,圖層管理交由Hierarchy負責,圖層數據獲取交由負責。
DraweeHierarchy:由多層Drawable組成,每層Drawable提供某種功能(例如:縮放、圓角)。
DraweeController:控制數據的獲取與圖片加載,向pipeline發出請求,並接收相應事件,並根據不同事件控制Hierarchy,從DraweeView接收用戶的事件,然後執行取消網絡請求、回收資源等操作。
DraweeHolder:統籌管理Hierarchy與DraweeHolder。
ImagePipeline:Fresco的核心模塊,用來以各種方式(內存、磁盤、網絡等)獲取圖像。
Producer/Consumer:Producer也有很多種,它用來完成網絡數據獲取,緩存數據獲取、圖片解碼等多種工作,它產生的結果由Consumer進行消費。
IO/Data:這一層便是數據層了,負責實現內存緩存、磁盤緩存、網絡緩存和其他IO相關的功能。