Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android Volley 獲取磁盤已有緩存數據

Android Volley 獲取磁盤已有緩存數據

編輯:關於Android編程

經過學習,我們知道Volley的架構如下:

\

從架構上我們可以看到,volley有設置緩存機制,當找不到數據緩存或數據緩存過期時,才會聯網獲取新的數據。Volley 本身有緩存機制,不僅僅默認緩存圖片,也有緩存Json數據。通過手機文件管理軟件,我們發現Volley緩存地址:/data/data/軟件包/cache/volley 目錄下。

那麼,在聯網獲取了數據緩存後,如何獲取到Volley緩存中的數據呢?在百度上找了一整天的資料都沒有說明如何獲取到最新的數據。最後還是再stack overflow中找到了相關的資料。

RequestQueue類中有一個子函數getCache()可以返回Cache實例,通過調用改實例中的get(url)函數可以查看手機磁盤中是否保存有緩存數據,其成員變量data保存著緩存的數據內容。即:queue.getCache().get(url).data

所以,我們可以通過以下語句,來選擇獲取緩存數據或者向服務器獲取最新數據。

 

if(queue.getCache().get(url)!=null){
  //response exists
  String cachedResponse = new String(queue.getCache().get(url).data);
}else{
  //no response
  queue.add(stringRequest);
}

 

 

其實這樣做還是有缺陷的,那就是如果服務器更新了數據的話,則我們客戶端沒辦法獲取最新數據,而是從緩存中調取緩存數據。

為此,我一個比較笨的方法是:判斷網絡是否可用,如果可用則更新數據,當網絡不可用時,采用緩存數據。

 

Context context = getActivity().getApplicationContext();
if(!isNetworkAvailable(context)){
	getFromDiskCache(url);		    	 //如果沒網,則調取緩存數據
}else{
//有網則從網上更新數據				 
//……(省略)
}
其中isNetworkAvailable()函數用於判斷網絡是否可用:

 

 

public static boolean isNetworkAvailable(Context context) {   
	try {
		ConnectivityManager manger = (ConnectivityManager) context
                .getSystemService(Context.CONNECTIVITY_SERVICE); 
        NetworkInfo info = manger.getActiveNetworkInfo();
        //return (info!=null && info.isConnected());
        if(info != null){
        	return info.isConnected();
        }else{
        	return false;
        }
	} catch (Exception e) {
        return false;
	}
}

getFromDiskCache()函數用於獲取緩存數據(以JSONArray為例):

 

 

private void getFromDiskCache(String url) {
	if(mQueue.getCache().get(url)!=null){
		try {
			String str = new String((mQueue.getCache().get(url).data);
			JSONArray response = new JSONArray(str);
			//……(省略操作)
		} catch (JSONException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}else{
		Log.d(TAG, 沒有緩存數據);  
	}
}
其實,在服務器沒響應時,我們也可以調用getFromDiskCache()函數來調取緩存數據的,在public void onErrorResponse(VolleyError error) { }中增加相應語句即可,這裡不做展開。

 

 

其實這是比較笨的辦法,按道理應該是向服務器請求,看是否有數據更新,有則更新數據(即服務器決定緩存是否可用)但是暫時不知道怎麼完成,等以後再改吧。

 


  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved