专栏首页向治洪android离线缓存技术

android离线缓存技术

离线缓存是指在有网络的状态下将从服务器获取的网络数据,如Json 数据缓存到本地,在断网的状态下启动APP时读取本地缓存数据显示在界面上,常用的APP(网易新闻、知乎等等)都是支持离线缓存的,这样带来了更好的用户体验。

如果能够在调用网络接口后自动缓存返回的Json数据,下次在断网状态下调用这个接口获取到缓存的Json数据的话,那该多好呢?Volley做到了这一点。

因此,今天这篇文章介绍的就是使用Volley自带的数据缓存,配合Universal-ImageLoader的图片缓存,实现断网状态下的图文显示。

实现效果

如何实现?

1.使用Volley访问网络接口

/**
* 获取网络数据
*/
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文件夹中。 

打开上面的文件,可以发现接口的路径和返回值都被保存在该文件里面了。 

当在断网状态时,如何获取到该接口的缓存的返回值呢?  使用RequestQueue提供的getCache()方法查询该接口的缓存数据

if (queue.getCache().get(TEST_API) != null) {
String cachedResponse = new String(queue.getCache().get(TEST_API).data);

2.使用Universal-ImageLoader加载图片

ImageLoader.getInstance().displayImage(head_img, imageView);

注意点

1.观察上面的缓存文件可以发现,Volley只缓存了接口路径,并没有缓存接口的传入参数,因此如果做分页查询的话,使用此方法是不妥的。  2.在测试过程中,依然发现有的时候获取不到缓存数据,有的时候却可以获取到。对获取缓存的代码延迟加载能够有效解决这个问题。  3.如果考虑到缓存的过期策略,可以使用更好的ASimpleCache框架辅助开发。对缓存有更高要求的APP,依然应该使用文件缓存或数据库缓存。

源代码下载

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • listview优化(中)

    1,对Imageview使用setTag()方法来解决图片错位问题,这个Tag中设置的是图片的url,然后在加载的时候取得这个url和要加载那position...

    xiangzhihong
  • Android通信安全之HTTPS

    Https HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的HT...

    xiangzhihong
  • 仿12306查询火车票功能

    首先感谢http://www.zuidaima.com/share/1861712958622720.html对我的帮助,我在此基础上修改了页面的显示, 先上效...

    xiangzhihong
  • 用户尝试登陆错误次数

    由于我们将使用shiro + ehache配合使用,所以可以不用单独再引用ehcache.jar了,使用shiro-ehcache时,会自动添加ehcache-...

    微醺
  • 让DeepLearning4j阅读小说并给出关联度最高的词

    DeepLearning4j是一个java的神经网络框架,便于java程序员使用神经网络来完成一些机器学习工程。

    天涯泪小武
  • 【深度学习】你该会的精选面试题(一)

    解析:正确答案A,更多层意味着网络更深。没有严格的定义多少层的模型才叫深度模型,目前如果有超过2层的隐层,那么也可以及叫做深度模型。

    zenRRan
  • 分布式改造剧集三:Ehcache分布式改造

    SecondWorld
  • 独家 |《TensorFlow实战》作者黄文坚:四大经典CNN网络技术原理

    AI科技评论按:2月28日下午3点,《TensorFlow实战》作者黄文坚做客【硬创公开课】,为我们讲解了关于四大经典CNN网络:AlexNet、VGGNet、...

    AI科技评论
  • 四大经典卷积网络介绍

    原标题:独家 |《TensorFlow实战》作者黄文坚:四大经典CNN网络技术原理

    DoubleV
  • java8学习整理

    由于项目中使用java8中的lambda表达式,因此想学习一下java8中的lambda表达式和stream流。

    路行的亚洲

扫码关注云+社区

领取腾讯云代金券