編輯:關於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()方法查詢該接口的緩存數據<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxwcmUgY2xhc3M9"brush:java;">
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,依然應該使用文件緩存或數據庫緩存。
源代碼下載
安裝Java開發工具包(JDK)的必要組件http://www.oracle.com/technetwork/java/javase/downloads/jdk8-dow
在實際的開發中,很多時候還會遇到相對比較復雜的需求,比如產品妹紙或UI妹紙在哪看了個讓人興奮的效果,興致高昂的來找你,看了之後目的很明確,當然就是希望你能給她;在這樣的關
什麼是XMLXML全稱為Extensible Markup Language, 意思是可擴展的標記語言,它是 SGML(標准通用標記語言)的一個子集。XML語法上和HTM
先看需求,要求這種效果