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

时间: 2024-10-14 22:09:34

Android Volley 获取磁盘已有缓存数据的相关文章

Android Volley获取json格式的数据

为了让Android能够快速地访问网络和解析通用的数据格式Google专门推出了Volley库,用于Android系统的网络传输.volley库可以方便地获取远程服务器的图片.字符串.json对象和json对象数组等.当然,java本身也有获取json对象的方法,然而为了更好地适应移动互联网,google专门为其做了特殊的优化,因而应该尽可能地使用Volley库. Volley官方文档:https://developer.android.com/training/volley/index.htm

android studio获取默认签名证书指纹数据

由于申请微信分享需要签名证书数据,在android studio里找了好久都没有找到,最后在网上查到了得通过studio下面的Terminal中获取 没有密码的,直接点击回车就好了

Android DiskLruCache完全解析,硬盘缓存的最佳方案(转)

概述 记得在很早之前,我有写过一篇文章<Android高效加载大图.多图解决方案,有效避免程序OOM>,这篇文章是翻译自Android Doc的,其中防止多图OOM的核心解决思路就是使用LruCache技术.但LruCache只是管理了内存中图片的存储与释放,如果图片从内存中被移除的话,那么又需要从网络上重新加载一次图片,这显然非常耗时.对此,Google又提供了一套硬盘缓存的解决方案:DiskLruCache(非Google官方编写,但获得官方认证).只可惜,Android Doc中并没有对

Android DiskLruCache完全解析,硬盘缓存的最佳方案

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/28863651 概述 记得在很早之前,我有写过一篇文章Android高效加载大图.多图解决方案,有效避免程序OOM,这篇文章是翻译自Android Doc的,其中防止多图OOM的核心解决思路就是使用LruCache技术.但LruCache只是管理了内存中图片的存储与释放,如果图片从内存中被移除的话,那么又需要从网络上重新加载一次图片,这显然非常耗时.对此,Google又提供了一套硬

Android Volley 库通过网络获取 JSON 数据

本文内容 什么是 Volley 库 Volley 能做什么 Volley 架构 演示 Volley 库通过网络获取 JSON 数据 参考资料 Android 关于网络操作一般都会介绍 HttpClient 以及 HttpConnection 这两个包.前者是 Apache 开源库,后者是 Android 自带 API.企业级应用,一般都会选择使用已经封装好的 http 框架.比较流行有 Volley.android-async-http.retrofit.okhttp.androidquery.

Android volley 解析(四)之缓存篇

这是 volley 的第四篇 blog 了,写完这篇,volley 的大部分用法也都算写了一遍,所以暂时不会写 volley 的文章了,如果想看我前面写的文章,可以点这里 Android volley 解析(三)之文件上传篇 为什么要用缓存 我们知道,当客户端在请求网络数据的时候,是需要消耗流量的,特别是对于移动端用户来说,对于流量的控制要求很高.所以在做网络请求的时候,如果对数据更新要求不是特别高,往往都会用到缓存机制,一方面能减少对服务端的请求,控制流量:另一方面,当客户端在没有网络的情况下

android获取某应用的帧数据

android获取某应用的帧数据: 说明: (打开手机 开发者选项-GPU显示配置文件(显示于 adb shell dumpsys gfxinfo)勾上,只有4.1以上支持) 在android4.1中,谷歌提供了一个工具来,叫做" GPU呈现模式分析(Profile GPU rendering)", 在开启这个功能后,系统就会记录保留每个界面最后128帧图像绘制的相关时间信息 开始操作: 命令行 adb shell dumpsys gfxinfo com.taobao.mobile.d

自定义ListView使用Volley获取数据

这是作为Volley框架使用的练习,如果对Volley框架的使用还不太熟悉, 建议先看前三篇文章: Android Volley的使用(一) Android Volley的使用(二) Android Volley的使用(三) 本文代码github地址:UseVolley 要实现的效果如下: Tips:以下大多数代码都是前三篇文章中详细介绍过的,在这里作为练习只提供一种思路,不再赘述 1,将Volley.jar添加进项目 获取Volley: git clone 的方式 https://androi

《ArcGIS Runtime SDK for Android开发笔记》——(12)、自定义方式加载Bundle格式缓存数据

随着ArcGIS 10.3的正式发布,Esri推出了新的紧凑型缓存格式以增强用户的访问体验.新的缓存格式下,Esri将缓存的索引信息.bundlx包含在了缓存的切片文件.bundle中.具体如下图所示: 对于bundle格式的具体解析,这里就不再详述,具体可以查阅8013是我的博文<ArcGIS for Server 10.3.X 新型紧凑型缓存的解读和应用>,本文内容就是根据其所述实现.再熟悉bundle实现机理后,结合相关加密算法,可以实现进一步缓存数据的加密解密过程. 转载请注明出处:h