Android 資料緩衝

來源:互聯網
上載者:User

Android 資料緩衝

採用緩衝,可以進一步大大緩解資料互動的壓力,又能提供一定的離線瀏覽。下邊簡略列舉一下緩衝管理的適用環境:

1. 提供網路服務的應用

2. 資料更新不需要即時更新,哪怕是3-5分鐘的延遲也是可以採用緩衝機制。

3. 緩衝的到期時間是可以接受的(類似網易的新聞閱讀,支援離線離線閱讀)

這樣所帶來的好處:

1. 減小伺服器的壓力

2. 提高用戶端的響應速度(本機資料提取嘛)

3. 一定程度上支援離線瀏覽(可以參考網易的那個新聞應用,個人感覺離線閱讀做得非常棒。)

 

一、緩衝管理的方法

緩衝管理的原理很簡:通過時間的設定來判斷是否讀取緩衝還是重新下載;斷網下就沒什麼好說的,直接去緩衝即可。

二、資料庫(SQLite)緩衝方式

這種方法是在下載完資料檔案後,把檔案的相關資訊如url,路經,下載時間,到期時間等存放到資料庫,當然我個人建議把url作為唯一的標識。下次下載的時候根據url先從資料庫中查詢,如果查詢到目前時間並未到期,就根據路徑讀取本地檔案,從而實現緩衝的效果。

從實現上我們可以看到這種方法可以靈活存放檔案的屬性,進而提供了很大的擴充性,可以為其它的功能提供一定的支援。

從操作上需要建立資料庫,每次查詢資料庫,如果到期還需要更新資料庫,清理緩衝的時候還需要刪除資料庫資料,稍顯麻煩,而資料庫操作不當又容易出現一系列的效能,ANR問題,指標錯誤問題,實現的時候要謹慎,具體作的話,但也只是增加一個工具類或方法的事情。

還有一個問題,緩衝的資料庫是存放在/data/data//databases/目錄下,是佔用記憶體空間的,如果緩衝累計,容易浪費記憶體,需要及時清理緩衝。

 

三、檔案快取方式

這種方法,使用File.lastModified()方法得到檔案的最後修改時間,與目前時間判斷是否到期,從而實現緩衝效果。

實現上只能使用這一個屬性,沒有為其它的功能提供支援人員的可能。操作上倒是簡單,比較時間即可,而且取的資料也就是檔案裡的JSON資料而已。本身處理也不容易帶來其它問題,代價低廉。

 

四、檔案法緩衝方式的兩點說明

1. 不同類型的檔案的緩衝時間不一樣。

籠統的說,不變檔案的緩衝時間是永久,變化檔案的緩衝時間是最大忍受不變時間。說白點,圖片檔案內容是不變的,一般存在SD卡上直到被清理,我們是可以永遠讀取緩衝的。設定檔內容是可能更新的,需要設定一個可接受的緩衝時間。

2. 不同環境下的緩衝時間標準不一樣。

無網路環境下,我們只能讀取快取檔案,為了應用有東西顯示,沒有什麼到期之說了。

WiFi網路環境下,緩衝時間可以設定短一點,一是網速較快,而是流量不要錢。

3G流量環境下,緩衝時間可以設定長一點,節省流量,就是節省金錢,而且使用者體驗也更好。

GPS就別說更新什麼的,已經夠慢的了。緩衝時間能多長就多長把。

當然,作為一款好的應用,不會死定一種情況,針對於不同網路變換不同形式的緩衝功能是必須有的。而且這個時間根據自己的實際情況來設定:資料的更新頻率,資料的重要性等。

 

五、何時重新整理

開發人員一方面希望盡量讀取緩衝,使用者一方面希望即時重新整理,但是響應速度越快越好,流量消耗越少越好(關於這塊,的確開發中我沒怎麼想到,畢竟介面就是這麼多,現在公司的產品幾乎點一下就訪問一下,而且還有些雞肋多餘的功能。慢慢修改哈哈),是一個矛盾。

其實何時重新整理我也不知道,這裡我提供兩點建議:

1. 資料的最長多長時間不變,對應用無大的影響。

比如,你的資料更新時間為4小時,則緩衝時間設定為1~2小時比較合適。也就是更新時間/緩衝時間=2,但使用者個人修改、網站編輯人員等一些人為的更新就另說。一天使用者總會看到更新,即便有延遲也好,視你產品的用途了;如果你覺得你是資訊類應用,再減少,2~4小時,如果你覺得資料比較重要或者比較受歡迎,使用者會經常把玩,再減少,1~2小時,依次類推。

2. 提供重新整理按鈕。

必要時候或最保險的方法使在相關介面提供一個重新整理按鈕,或者當下流行的下拉式清單重新整理方式。為緩衝,為載入失敗提供一次重新來過的機會。

 

 

從實現上我們全面考慮了幾個細節,注釋已經說明,不再贅述。
然後我們調用方法如下:
void getConfig(){        //首先嘗試讀取緩衝        String cacheConfigString = ConfigCache.getUrlCache(CONFIG_URL);        //根據結果判定是讀取緩衝,還是重新讀取        if (cacheConfigString != null) {            showConfig(cacheConfigString);        } else {            //如果緩衝結果是空,說明需要重新載入            //緩衝為空白的原因可能是1.無緩衝;2. 緩衝到期;3.讀取緩衝出錯            AsyncHttpClient client = new AsyncHttpClient();            client.get(CONFIG_URL, new AsyncHttpResponseHandler(){                 @Override                public void onSuccess(String result){                    //成功下載,則儲存到本地作為後面快取檔案                    ConfigCache.setUrlCache(result,  CONFIG_URL);                    //後面可以是UI更新,僅供參考                    showConfig(result);                }                 @Override                public void onFailure(Throwable arg0) {                    //根據失敗原因,考慮是顯示載入失敗,還是再讀取緩衝                }             });        }    }

 

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.