Android 離線緩衝的快速實現
離線緩衝是指在有網路的狀態下將從伺服器擷取的網路資料,如Json 資料緩衝到本地,在斷網的狀態下啟動APP時讀取本機快取資料顯示在介面上,常用的APP(網易新聞、知乎等等)都是支援離線緩衝的,這樣帶來了更好的使用者體驗。
如果能夠在調用網路介面後自動緩衝返回的Json資料,下次在斷網狀態下調用這個介面擷取到緩衝的Json資料的話,那該多好呢?Volley做到了這一點。
因此,今天這篇文章介紹的就是使用Volley內建的資料緩衝,配合Universal-ImageLoader的圖片緩衝,實現斷網狀態下的圖文顯示。
實現效果
如何??
1.使用Volley訪問網路介面
/** * 擷取網路資料 */ private void getData() { StringRequest stringRequest = new StringRequest(Request.Method.POST, TEST_API, new Response.Listener() { @Override public void onResponse(String s) { textView.setText("data from Internet: " + s); try { JSONObject jsonObject = new JSONObject(s); JSONArray resultList = jsonObject.getJSONArray("resultList"); JSONObject JSONObject = (org.json.JSONObject) resultList.opt(0); String head_img = JSONObject.getString("head_img"); ImageLoader.getInstance().displayImage(head_img, imageView); } catch (JSONException e) { e.printStackTrace(); } } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError volleyError) { } }) { @Override protected Map getParams() throws AuthFailureError { Map map = new HashMap(); map.put("phone", "15962203803"); map.put("password", "123456"); return map; } }; queue.add(stringRequest); }
當介面訪問成功以後,Volley會自動緩衝此次紀錄在/data/data/{package name}/cache/volley檔案夾中。
開啟上面的檔案,可以發現介面的路徑和傳回值都被儲存在該檔案裡面了。
當在斷網狀態時,如何擷取到該介面的緩衝的傳回值呢?
使用RequestQueue提供的getCache()方法查詢該介面的快取資料
if (queue.getCache().get(TEST_API) != null) { String cachedResponse = new String(queue.getCache().get(TEST_API).data);
2.使用Universal-ImageLoader載入圖片
ImageLoader.getInstance().displayImage(head_img, imageView);
注意點
1.觀察上面的快取檔案可以發現,Volley只緩衝了介面路徑,並沒有緩衝介面的傳入參數,因此如果做分頁查詢的話,使用此方法是不妥的。
2.在測試過程中,依然發現有的時候擷取不到快取資料,有的時候卻可以擷取到。對擷取緩衝的代碼消極式載入能夠有效解決這個問題。
3.如果考慮到緩衝的到期策略,可以使用更好的ASimpleCache架構輔助開發。對緩衝有更高要求的APP,依然應該使用檔案快取或資料庫緩衝。
原始碼下載