離線緩存就是在網(wǎng)絡暢通的情況下將從服務器收到的數(shù)據(jù)保存到本地,當網(wǎng)絡斷開之后直接讀取本地文件中的數(shù)據(jù)。如json 數(shù)據(jù)緩存到本地,在斷網(wǎng)的狀態(tài)下啟動app時讀取本地緩存數(shù)據(jù)顯示在界面上,常用的app(網(wǎng)易新聞、知乎等等)都是支持離線緩存的,這樣帶來了更好的用戶體驗。
如果能夠在調(diào)用網(wǎng)絡接口后自動緩存返回的json數(shù)據(jù),下次在斷網(wǎng)狀態(tài)下調(diào)用這個接口獲取到緩存的json數(shù)據(jù)的話,那該多好呢?volley做到了這一點。
因此,今天這篇文章介紹的就是使用volley自帶的數(shù)據(jù)緩存,配合universal-imageloader的圖片緩存,實現(xiàn)斷網(wǎng)狀態(tài)下的圖文顯示。
實現(xiàn)效果
如何實現(xiàn)?
1.使用volley訪問網(wǎng)絡接口
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
/** * 獲取網(wǎng)絡數(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); } |
當接口訪問成功以后,volley會自動緩存此次紀錄在/data/data/{package name}/cache/volley文件夾中。
打開上面的文件,可以發(fā)現(xiàn)接口的路徑和返回值都被保存在該文件里面了。
當在斷網(wǎng)狀態(tài)時,如何獲取到該接口的緩存的返回值呢?
使用requestqueue提供的getcache()方法查詢該接口的緩存數(shù)據(jù)
1
2
|
if (queue.getcache().get(test_api) != null ) { string cachedresponse = new string(queue.getcache().get(test_api).data); |
2.使用universal-imageloader加載圖片
1
|
imageloader.getinstance().displayimage(head_img, imageview); |
注意點
1.觀察上面的緩存文件可以發(fā)現(xiàn),volley只緩存了接口路徑,并沒有緩存接口的傳入?yún)?shù),因此如果做分頁查詢的話,使用此方法是不妥的。
2.在測試過程中,依然發(fā)現(xiàn)有的時候獲取不到緩存數(shù)據(jù),有的時候卻可以獲取到。對獲取緩存的代碼延遲加載能夠有效解決這個問題。
3.如果考慮到緩存的過期策略,可以使用更好的asimplecache框架輔助開發(fā)。對緩存有更高要求的app,依然應該使用文件緩存或數(shù)據(jù)庫緩存。
以上內(nèi)容是小編給大家介紹的android實現(xiàn)離線緩存的方法,希望對大家有所幫助!