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