行動裝置 App開發(IOS/android等)中一個通用的圖片緩衝方案講解(附流程圖)
在行動裝置 App開發中,我們經常會遇到從網路請求圖片到裝置上展示的情境。
如果每次都重複發起請求,浪費流量、浪費電量,使用者體驗也不佳;
將圖片持久化到磁碟也不失為一種策略;但每次從檔案讀取圖片也存在一定的io開銷,就算採用此策略,我們也需要控制磁碟緩衝的容量,以免佔用過多系統資源。
其實沒有一個方案可以說是完美的方案,只有最適合自己業務需求的方案,才可以說是一個好方案。
我們下面所講解的方案具備很強的通用性,設計思路簡單而清晰:
1.假設每個網狀圖片的url具有唯一性,如果網路上的圖片變化了,會引起輸入源的url變化;
2.基於1,我們將url作為圖片緩衝的唯一標識(可以做hash,做md5,也可以用urlstring作為key,都是可以的)
3.訪問優先順序:記憶體緩衝>磁碟緩衝>網路資源
以上3點就是我們這個方案的基本策略,以下是技術細節:
1.對於緩衝的管理,我們可以設定閥值(包括緩衝存在時間和緩衝容量),達到條件觸發清理;還可以結合LRU(Least Recently Used 近期最少使用演算法)演算法來提升緩衝訪問效率,這需要在寫緩衝時對緩衝的使用次數進行相應標記,此處對此演算法不展開,有興趣的自行google.
2.對於網路資源的載入我們必須採用非同步方案,如此做才不會阻塞ui的展示;可以將請求加到隊列中支援並發請求,需要注意的是我們可以根據某個地址可以支援同時串連的url數量來設定最大並發請求數目,來提高效率。
3.在訪問磁碟緩衝/網路資源成功時,需要填充高優先順序的緩衝,當磁碟緩衝訪問成功時,填充記憶體緩衝;當網路資源訪問成功時,填充記憶體緩衝+磁碟緩衝。
對於具體的使用場合我們可以根據業務需要來決定是否採納或部分採納此方案,也可以對此方案中的一些策略根據項目需要進行修改(比如何時不訪問磁碟緩衝、何時清空緩衝、何時強制重新整理緩衝等),來滿足業務需求。