Android Volley 获取磁盘已有缓存数据

经过学习,我们知道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) { }中增加相应语句即可,这里不做展开。


其实这是比较笨的办法,按道理应该是向服务器请求,看是否有数据更新,有则更新数据(即服务器决定缓存是否可用)但是暂时不知道怎么完成,等以后再改吧。


参考链接:

http://stackoverflow.com/questions/21902063/volley-how-to-cache-loaded-data-to-disk-and-load-them-when-no-connection-avail

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是几个 Android 缓存数据的示例: 1. Shared Preferences: ```java // 保存数据到 SharedPreferences SharedPreferences.Editor editor = getSharedPreferences("my_prefs", MODE_PRIVATE).edit(); editor.putString("key", "value"); editor.apply(); // 从 SharedPreferences 中获取数据 SharedPreferences preferences = getSharedPreferences("my_prefs", MODE_PRIVATE); String value = preferences.getString("key", ""); ``` 2. SQLite 数据库: ```java // 创建 SQLiteOpenHelper 对象 SQLiteOpenHelper dbHelper = new MyDatabaseHelper(context, "my_database", null, 1); // 保存数据到 SQLite 数据库 SQLiteDatabase db = dbHelper.getWritableDatabase(); ContentValues values = new ContentValues(); values.put("name", "John"); values.put("age", 25); db.insert("user", null, values); // 从 SQLite 数据库中获取数据 SQLiteDatabase db = dbHelper.getReadableDatabase(); String[] columns = {"name", "age"}; Cursor cursor = db.query("user", columns, null, null, null, null, null); while (cursor.moveToNext()) { String name = cursor.getString(cursor.getColumnIndex("name")); int age = cursor.getInt(cursor.getColumnIndex("age")); } cursor.close(); ``` 3. 文件缓存: ```java // 保存数据到文件缓存 String data = "Hello, world!"; File cacheDir = context.getCacheDir(); File cacheFile = new File(cacheDir, "data.txt"); BufferedWriter writer = new BufferedWriter(new FileWriter(cacheFile)); writer.write(data); writer.close(); // 从文件缓存获取数据 File cacheDir = context.getCacheDir(); File cacheFile = new File(cacheDir, "data.txt"); BufferedReader reader = new BufferedReader(new FileReader(cacheFile)); String data = ""; String line; while ((line = reader.readLine()) != null) { data += line; } reader.close(); ``` 4. 内存缓存: ```java // 使用 LruCache 进行内存缓存 LruCache<String, String> cache = new LruCache<>(10); cache.put("key", "value"); String value = cache.get("key"); // 使用其他缓存框架进行内存缓存,如 Glide、Volley 等 Glide.with(context).load(url).diskCacheStrategy(DiskCacheStrategy.ALL).into(imageView); ``` 以上示例仅供参考,实际使用时需要根据具体需求进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值