1. 程式人生 > >安卓網路資料快取策略

安卓網路資料快取策略

前言

對於大部分 App 來說,網路請求都是必不可少的,而且不少App是以資料為主。如果不做資料快取,在網路慢的情況下,會降低使用者體驗度。

彷彿有一段時間沒寫部落格了,嚇得我都祭出了神圖。

Json/Xml資料快取策略

對於文字類資料,同一個地址的請求結果一般是會隨著時間而變化的,所以需要根據應用的需求來做快取。

  1. 資料實時性高
    常見的此類應用:新聞、朋友圈、股票、社群等。
    無論是否存在快取,都應該去請求網路,快取只是充當了一個“預設資料”的角色。也就是先顯示快取資料,然後請求網路,顯示最新的資料。

    虛擬碼如下:

    如果 (存在快取) {
        讀取快取並顯示
    }
    請求網路
    寫入快取
    顯示網路資料

    流程很簡單,但其中存在很多細節。比如,如果快取可用,請求網路的時候,不應該顯示正在載入的介面,網路請求失敗的時候,也不應該顯示錯誤介面。
    每個資料請求,都包含大量的邏輯判斷和分支,你完全可以這樣實現,但這樣的程式碼不夠優雅,在下一篇文章 RxJava2.0在安卓中的二級快取策略 我將會介紹用 RxJava2.0 實現此類資料快取。

  2. 資料定期更新或不頻繁變化
    常見的此類應用:應用市場、小說、定期更新的乾貨類
    這類應用,根據情況,對快取的資料設定一個過期時間,只要時間未過期,就優先使用快取,當快取過期後,優先使用網路。

    虛擬碼如果:

    如果 (存在快取 且 快取未過期) {
        讀取快取並顯示
        返回
    }
    請求網路 更新快取 顯示最新資料

    這類應用邏輯就更簡單,要麼顯示快取資料,要麼請求網路。同樣,下一篇文章我會介紹 RxJava2.0 的實現方式。

  3. 沒網無法使用型別
    常見的此類應用:外賣類、購物類、打車類、金融類等。
    這類應用離開了網路,就不能正常使用了,所以你可以選擇不做快取。

圖片快取策略

對於圖片來說,基本是地址確定了,內容就不會變化。所以可以放心的持久化儲存而不用擔心過期。
但圖片比較特殊,它佔用的記憶體較大,即使是本地的圖片,也可能有較大的載入延遲。這個時候,網路+本地的快取策略已經不夠用了。
聰明的同學已經想到了,網路+本地+記憶體的三級快取策略。優先讀取記憶體資料,其實是本地資料,最後是網路資料。
但這其中也有很多細節需要注意。

  1. 記憶體不足
    如果把所有圖片全部快取到記憶體,用不了多久就會出現 OOM。
    所以,只能部分快取到記憶體。這時候,記憶體快取的主要問題就變成選擇快取圖片的問題了。
    常用的選擇策略是,LRU策略,也就是近期最少使用的演算法,當記憶體不足時,優先刪除近期最少使用的圖片。

  2. 佔用儲存過多
    和記憶體一樣的道理,即便是本地儲存,也不可能無限制的儲存。我們一般會為本地快取劃分一個最大儲存容量,這個容量可以手動指定,也可以根據當前裝置的容量來計算。當本地快取滿時,優先清除最老的資料。

看到這裡你可能覺得圖片快取太過麻煩了,確實是這樣的,不過幸好,有很多優秀的第三方開源庫已經完美的解決了這些問題,比如 glide