編輯:關於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,依然應該使用文件緩存或數據庫緩存。
源代碼下載
Android數據存儲之GreenDao 3.0 詳解(一),androidgreendao前言: 今天一大早收到GreenDao 3.0 正式發布的消息,自
Android應用坐標系統全面詳解 1 背景 去年有很多人私信告訴我讓說說自定義控件,其實通觀網絡上的很多博客都在講各種自定義控件,但是大多數都是授之以魚,卻很少有較為
Android pendingInten 用法詳解 pendingIntent字面意義:等待的,未決定的Intent。 要得到一個pendingIntent對象,使用方法
Android網絡編程(三)Volley用法全解析 相關文章 Android網絡編程(一)HTTP協議原理 Android網絡編程(二)HttpClient與HttpUR