Android實(shí)現(xiàn)離線緩存的方法
離線緩存就是在網(wǎng)絡(luò)暢通的情況下將從服務(wù)器收到的數(shù)據(jù)保存到本地,當(dāng)網(wǎng)絡(luò)斷開(kāi)之后直接讀取本地文件中的數(shù)據(jù)。如Json 數(shù)據(jù)緩存到本地,在斷網(wǎng)的狀態(tài)下啟動(dòng)APP時(shí)讀取本地緩存數(shù)據(jù)顯示在界面上,常用的APP(網(wǎng)易新聞、知乎等等)都是支持離線緩存的,這樣帶來(lái)了更好的用戶(hù)體驗(yàn)。
如果能夠在調(diào)用網(wǎng)絡(luò)接口后自動(dòng)緩存返回的Json數(shù)據(jù),下次在斷網(wǎng)狀態(tài)下調(diào)用這個(gè)接口獲取到緩存的Json數(shù)據(jù)的話,那該多好呢?Volley做到了這一點(diǎn)。
因此,今天這篇文章介紹的就是使用Volley自帶的數(shù)據(jù)緩存,配合Universal-ImageLoader的圖片緩存,實(shí)現(xiàn)斷網(wǎng)狀態(tài)下的圖文顯示。
實(shí)現(xiàn)效果
如何實(shí)現(xiàn)?
1.使用Volley訪問(wèn)網(wǎng)絡(luò)接口
/** * 獲取網(wǎng)絡(luò)數(shù)據(jù) */ 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); }
當(dāng)接口訪問(wèn)成功以后,Volley會(huì)自動(dòng)緩存此次紀(jì)錄在/data/data/{package name}/cache/volley文件夾中。
打開(kāi)上面的文件,可以發(fā)現(xiàn)接口的路徑和返回值都被保存在該文件里面了。
當(dāng)在斷網(wǎng)狀態(tài)時(shí),如何獲取到該接口的緩存的返回值呢?
使用RequestQueue提供的getCache()方法查詢(xún)?cè)摻涌诘木彺鏀?shù)據(jù)
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);
注意點(diǎn)
1.觀察上面的緩存文件可以發(fā)現(xiàn),Volley只緩存了接口路徑,并沒(méi)有緩存接口的傳入?yún)?shù),因此如果做分頁(yè)查詢(xún)的話,使用此方法是不妥的。
2.在測(cè)試過(guò)程中,依然發(fā)現(xiàn)有的時(shí)候獲取不到緩存數(shù)據(jù),有的時(shí)候卻可以獲取到。對(duì)獲取緩存的代碼延遲加載能夠有效解決這個(gè)問(wèn)題。
3.如果考慮到緩存的過(guò)期策略,可以使用更好的ASimpleCache框架輔助開(kāi)發(fā)。對(duì)緩存有更高要求的APP,依然應(yīng)該使用文件緩存或數(shù)據(jù)庫(kù)緩存。
以上內(nèi)容是小編給大家介紹的Android實(shí)現(xiàn)離線緩存的方法,希望對(duì)大家有所幫助!
相關(guān)文章
Android開(kāi)發(fā)中ListView自定義adapter的封裝
這篇文章主要為大家詳細(xì)介紹了android開(kāi)發(fā)中ListView自定義adapter的封裝,ListView的模板寫(xiě)法,感興趣的小伙伴們可以參考一下2016-09-09Android簡(jiǎn)單實(shí)用的可拖拽GridView組件分享
在我們?nèi)粘i_(kāi)發(fā)中,使用?GridView?這種網(wǎng)格視圖的場(chǎng)合還是不少的,本篇我們來(lái)介紹一個(gè)支持拖拽的?GridView?組件,可以輕松搞定網(wǎng)格視圖的拖拽排序,需要的可以參考一下2023-06-06Android中EditText光標(biāo)在4.0中的bug及解決方法
這篇文章主要介紹了Android中EditText光標(biāo)在4.0中的bug及解決方法,簡(jiǎn)單分析了Android4.0版本中EditText光標(biāo)消息的原因及相應(yīng)的解決方法,需要的朋友可以參考下2016-01-01Android自定義TextView實(shí)現(xiàn)文字圖片居中顯示的方法
下面小編就為大家分享一篇Android自定義TextView實(shí)現(xiàn)文字圖片居中顯示的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-01-01Flutter實(shí)現(xiàn)牛頓擺動(dòng)畫(huà)效果的示例代碼
牛頓擺大家應(yīng)該都不陌生,也叫碰碰球、永動(dòng)球(理論情況下),那么今天我們用Flutter實(shí)現(xiàn)這么一個(gè)理論中的永動(dòng)球,可以作為加載Loading使用,需要的可以參考一下2022-04-04

OpenGL Shader實(shí)例分析(2)繪制心臟跳動(dòng)效果

android開(kāi)發(fā)教程之獲取使用當(dāng)前api的應(yīng)用程序名稱(chēng)