離線緩存就是在網絡暢通的狀況下將從服務器收到的數據保存到本地,當網絡斷開以後直接讀取本地文件中的數據。如Json 數據緩存到本地,在斷網的狀態下啓動APP時讀取本地緩存數據顯示在界面上,經常使用的APP(網易新聞、知乎等等)都是支持離線緩存的,這樣帶來了更好的用戶體驗。java
若是可以在調用網絡接口後自動緩存返回的Json數據,下次在斷網狀態下調用這個接口獲取到緩存的Json數據的話,那該多好呢?Volley作到了這一點。數據庫
所以,今天這篇文章介紹的就是使用Volley自帶的數據緩存,配合Universal-ImageLoader的圖片緩存,實現斷網狀態下的圖文顯示。json
實現效果緩存
如何實現?服務器
1.使用Volley訪問網絡接口網絡
/** * 獲取網絡數據 */ private void getData() { StringRequest stringRequest = new StringRequest(Request.Method.POST, TEST_API, new Response.Listener<String>() { @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<String, String> getParams() throws AuthFailureError { Map<String, String> map = new HashMap<String, String>(); map.put("phone", "15962203803"); map.put("password", "123456"); return map; } }; queue.add(stringRequest); }
當接口訪問成功之後,Volley會自動緩存這次紀錄在/data/data/{package name}/cache/volley文件夾中。框架
打開上面的文件,能夠發現接口的路徑和返回值都被保存在該文件裏面了。ide
當在斷網狀態時,如何獲取到該接口的緩存的返回值呢?
使用RequestQueue提供的getCache()方法查詢該接口的緩存數據測試
if (queue.getCache().get(TEST_API) != null) { String cachedResponse = new String(queue.getCache().get(TEST_API).data);
2.使用Universal-ImageLoader加載圖片code
ImageLoader.getInstance().displayImage(head_img, imageView);
注意點
1.觀察上面的緩存文件能夠發現,Volley只緩存了接口路徑,並無緩存接口的傳入參數,所以若是作分頁查詢的話,使用此方法是不妥的。
2.在測試過程當中,依然發現有的時候獲取不到緩存數據,有的時候卻能夠獲取到。對獲取緩存的代碼延遲加載可以有效解決這個問題。
3.若是考慮到緩存的過時策略,能夠使用更好的ASimpleCache框架輔助開發。對緩存有更高要求的APP,依然應該使用文件緩存或數據庫緩存。
以上內容是小編給你們介紹的Android實現離線緩存的方法,但願對你們有所幫助!