搜索
热搜: 活动 交友 discuz
查看: 4728|回复: 0
打印 上一主题 下一主题

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

[复制链接]

160

主题

165

帖子

814

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
814
跳转到指定楼层
楼主
发表于 2017-7-11 14:41:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

经过学习,我们知道Volley的架构如下:


从架构上我们可以看到,volley有设置缓存机制,当找不到数据缓存或数据缓存过期时,才会联网获取新的数据。Volley 本身有缓存机制,不仅仅默认缓存图片,也有缓存Json数据。通过手机文件管理软件,我们发现Volley缓存地址:/data/data/软件包/cache/volley 目录下。

那么,在联网获取了数据缓存后,如何获取到Volley缓存中的数据呢?在百度上找了一整天的资料都没有说明如何获取到最新的数据。最后还是再stack overflow中找到了相关的资料。

RequestQueue类中有一个子函数getCache()可以返回Cache实例,通过调用改实例中的get(url)函数可以查看手机磁盘中是否保存有缓存数据,其成员变量data保存着缓存的数据内容。即:queue.getCache().get(url).data

所以,我们可以通过以下语句,来选择获取缓存数据或者向服务器获取最新数据。

  1. if(queue.getCache().get(url)!=null){
  2.   //response exists
  3.   String cachedResponse = new String(queue.getCache().get(url).data);
  4. }else{
  5.   //no response
  6.   queue.add(stringRequest);
  7. }
复制代码
其实这样做还是有缺陷的,那就是如果服务器更新了数据的话,则我们客户端没办法获取最新数据,而是从缓存中调取缓存数据。

为此,我一个比较笨的方法是:判断网络是否可用,如果可用则更新数据,当网络不可用时,采用缓存数据。
  1. Context context = getActivity().getApplicationContext();
  2. if(!isNetworkAvailable(context)){
  3.     getFromDiskCache(url);               //如果没网,则调取缓存数据
  4. }else{
  5. //有网则从网上更新数据                 
  6. //……(省略)
  7. }
复制代码
其中isNetworkAvailable()函数用于判断网络是否可用


  1. public static boolean isNetworkAvailable(Context context) {   
  2.     try {
  3.         ConnectivityManager manger = (ConnectivityManager) context
  4.                 .getSystemService(Context.CONNECTIVITY_SERVICE);
  5.         NetworkInfo info = manger.getActiveNetworkInfo();
  6.         //return (info!=null && info.isConnected());
  7.         if(info != null){
  8.             return info.isConnected();
  9.         }else{
  10.             return false;
  11.         }
  12.     } catch (Exception e) {
  13.         return false;
  14.     }
  15. }
复制代码
getFromDiskCache()函数用于获取缓存数据(以JSONArray为例):


  1. private void getFromDiskCache(String url) {
  2.     if(mQueue.getCache().get(url)!=null){
  3.         try {
  4.             String str = new String((mQueue.getCache().get(url).data);
  5.             JSONArray response = new JSONArray(str);
  6.             //……(省略操作)
  7.         } catch (JSONException e) {
  8.             // TODO Auto-generated catch block
  9.             e.printStackTrace();
  10.         }
  11.     }else{
  12.         Log.d(TAG, 没有缓存数据);  
  13.     }
  14. }
复制代码
  1. 其实,在服务器没响应时,我们也可以调用getFromDiskCache()函数来调取缓存数据的,在public void onErrorResponse(VolleyError error) { }中增加相应语句即可,这里不做展开。



复制代码


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|安卓论坛  

GMT+8, 2024-5-4 13:17 , Processed in 0.057158 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2013 Design S!|ƽ̶

快速回复 返回顶部 返回列表