Android开发本质上就是手机和互联网中的web服务器之间进行通信,就必然需要从服务端获取数据,而反复通过网络获取数据是比较耗时的,特别是访问比较多的时候,会极大影响了性能,Android中可通过二级缓存来减少频繁的网络操作,减少流量、提升性能。

一、二级缓存工作机制

  所谓二级缓存实际上并不复杂,当Android端需要获得数据时比如获取网络中的图片,我们首先从内存中查找(按键查找),内存中没有的再从磁盘文件或sqlite中去查找,若磁盘中也没有才通过网络获取;当获得来自网络的数据,就以key-value对的方式先缓存到内存(一级缓存),同时缓存到文件或sqlite中(二级缓存)。注意:内存缓存会造成堆内存泄露,所有一级缓存通常要严格控制缓存的大小,一般控制在系统内存的1/4。

  理解了二级缓存大家可能会有个问题网络中的数据是变化的,数据一旦放入缓存中,再取该数据就是从缓存中获得,这样岂不是不能体现数据的变化?我们在缓存数据时会设置有效时间,比如说30分钟,若超过这个时间数据就失效并释放空间,然后重新请求网络中的数据。有的童鞋就问30分钟内咋办?那好吧,我也没招了,只有下拉刷新了, 实际上这不是问题。

二、二级缓存的实现

  如何实现二级缓存,有很多技术方案,在这里我们使用 ASimpleCache框架来给大家演示一下,通过名字就可以看出它是很容易实现的。

1、ACache介绍

  ASimpleCache是一个轻量级的开源cache框架,实际上就是一个叫ACache的java类。已经在商业项目中使用,运行效果不错。

  下载地址:https://github.com/yangfuhai/ASimpleCache

2、ACache使用

  我们先做一个实现数据缓存的案例,然后再归纳一下主要的方法

  编写NewsListActivity主要代码如下:

  1. public class NewsListActivity extends Activity {
  2. private List<News> list;
  3. private ListView listView;
  4. private LoadImageAdapter adapter;//适配器
  5. private ACache acache;//缓存框架
  6. @Override
  7. protected void onCreate(Bundle savedInstanceState) {
  8. // TODO Auto-generated method stub
  9. super.onCreate(savedInstanceState);
  10. super.setContentView(R.layout.load_img_listview_activity);
  11. acache=ACache.get(this);//创建ACache组件
  12. initView();//初始化界面,代码不贴了
  13. }
  14.  
  15. public void loadData(){
  16. String cacheData=acache.getAsString("newsList");//从缓存中取数据
  17. if(cacheData!=null){//如果缓存中有,就不访问网络
  18. List<News> newsList=gson.fromJson(cacheData, new TypeToken<List<News>>(){}.getType());//将json转为List
  19. list.addAll(newsList);
  20. adapter.notifyDataSetChanged();
  21. return;
  22. }
  23. new Thread(new Runnable() {
  24. @Override
  25. public void run() {
  26. // TODO Auto-generated method stub
  27. SystemClock.sleep(2000);//模拟网络耗时
  28. String json=request();//模拟从网络中获取json数据
  29. acache.put("newslist", json, 60*60*1);//将数据存入缓存中,有效时间设置为1小时
  30. List<News> newsList=gson.fromJson(json, new TypeToken<List<News>>(){}.getType());
  31. list.addAll(newsList);
  32. handler.sendEmptyMessage(1);
  33. }
  34.  
  35. }).start();
  36. }
  37. /**
  38. * 模拟网络请求方法
  39. * @return json数据
  40. */
  41. private String request(){
  42. News news=null;
  43. for(int i=0;i<10;i++){
  44. news=new News();
  45. news.setId(i);
  46. news.setImgUrl("course/img/face_"+i+".png");
  47. news.setTitle("新闻标题"+i);
  48. news.setSummary("测试"+i);
  49. list.add(news);
  50. }
  51. Gson gson=new Gson();
  52. return gson.toJson(list);
  53. }
  54.  
  55. private Handler handler=new Handler()
  56. @Override
  57. public void handleMessage(Message msg) {
  58. // TODO Auto-generated method stub
  59. switch(msg.what){
  60. case 1:
  61. notify_layout.setVisibility(View.GONE);
  62. adapter.notifyDataSetChanged();
  63. break;
  64. }
  65. }
  66. }

  红色部分就是ASimpleCache实现缓存数据的代码,下面我们说一下主要代码

1、 创建ACache组件

  ACache   acache=ACache.get(context)

      或

  ACache   acache=ACache.get(context,max_size,max_count)

参数说明:  

  max_size:设置限制缓存大小,默认为50M

  max_count:设置缓存数据的数量,默认不限制

2、 设置缓存数据

  acache.put(key,data,time)或acache.put(key,data)

  将数据同时上存入一级缓存(内存Map)和二级缓存(文件)中

参数说明:  

  Key:为存入缓存的数据设置唯一标识,取数据时就根据key来获得的

  Data:要存入的数据,acache支持的数据类型如图所示:


  有String、可序列化的对象、字节数组、Drawable等
  Time:设置缓存数据的有效时间,单位秒

3、 从缓存中取数据

  提供一系列getAsXXX()方法,如图所示

  根据不同存入数据,调用不同的方法取数据

Android 中的缓存机制与实现的更多相关文章

  1. Android中的缓存机制与实现

    分步阅读 Android开发本质上就是手机和互联网中的web服务器之间进行通信,就必然需要从服务端获取数据,而反复通过网络获取数据是比较耗时的,特别是访问比较多的时候,会极大影响了性能,Android ...

  2. 浅析Android中的消息机制(转)

    原博客地址:http://blog.csdn.net/liuhe688/article/details/6407225 在分析Android消息机制之前,我们先来看一段代码: public class ...

  3. 浅析Android中的消息机制(转)

    在分析Android消息机制之前,我们先来看一段代码: public class MainActivity extends Activity implements View.OnClickListen ...

  4. Android中的Parcel机制 实现Bundle传递对象

    Android中的Parcel机制    实现了Bundle传递对象    使用Bundle传递对象,首先要将其序列化,但是,在Android中要使用这种传递对象的方式需要用到Android Parc ...

  5. 浅析Android中的消息机制-解决:Only the original thread that created a view hierarchy can touch its views.

    在分析Android消息机制之前,我们先来看一段代码: public class MainActivity extends Activity implements View.OnClickListen ...

  6. 浅析Android中的消息机制

    在分析Android消息机制之前,我们先来看一段代码: public class MainActivity extends Activity implements View.OnClickListen ...

  7. 探索Android中的Parcel机制(上)

    一.先从Serialize说起 我们都知道JAVA中的Serialize机制,译成串行化.序列化……,其作用是能将数据对象存入字节流其中,在须要时又一次生成对象.主要应用是利用外部存储设备保存对象状态 ...

  8. 重温Android中的消息机制

    引入: 提到Android中的消息机制,大家应该都不陌生,我们在开发中不可避免的要和它打交道.从我们开发的角度来看,Handler是Android消息机制的上层接口.我们在平时的开发中只需要和Hand ...

  9. Android 中的广播机制

    Android 中的广播机制 Android 中的广播,按照广播响应范围,可以分为应用内广播和全局广播.按照广播的接收方式,可以分为标准广播和有序广播. 广播的分类 响应范围 应用内广播:此类广播只能 ...

随机推荐

  1. js null和undefined

    在JavaScript开发中,被人问到:null与undefined到底有啥区别? 一时间不好回答,特别是undefined,因为这涉及到undefined的实现原理. 总所周知:null == un ...

  2. Mac os壁纸提取

    想必用过Mac os系统的朋友都知道mac壁纸,提取出来用作壁纸是十分好看的 下面给出壁纸的位置,自己用文件管理器打开然后复制出来即可! 系统盘:/Library/DesktopPictures

  3. Code First06---CodeFirst中的一对多关系

    本章我将介绍Code First将类之间的引用关系映射为数据表之间的一对多关系的默认规则.主要包含以下两部分内容: 1.Code First将类之间的引用关系映射为数据表之间一对多关系的默认规则. 2 ...

  4. Java Io(数据输入输出流)

    Java Io 字节流中的DataInputStream 和 DataOutputStream,使用流更加方便,是流的一个扩展,更方便读取int, long,字符等类型数据. 事例代码如下: pack ...

  5. @synthesize的正确使用方式

    @synthesize的正确使用方式 一. @synthesize的错误使用方式 类1和类2是继承关系, name是类1的属性 但是类2的实现里加入了@synthesize name = _name; ...

  6. ios中二维码的使用之一: 二维码的生成

    iOS在7之后,具备了原生的二维码生成API; 生成二维码的准备:  #import <CoreImage/CoreImage.h> 导入框架: 开始生成: //1- 创建过滤器 CIFi ...

  7. Ubuntu 中安装 NetBeans IDE

    NetBeans 8.2 刚刚发布,如果你还没有安装的话,这篇简短的教程将会演示如何在 Ubuntu 系统上快速的安装.对安装 NetBeans 需要帮助的开发者来说,这往篇文章会是不错的指导. 给那 ...

  8. windows安装rsync

    客户端:cwRsync 4.0.5 Installer 服务端:cwRsyncServer 4.0.5 Installer 安装配置Rsync服务端 1.直接双击安装包安装即可,在安装过程中会有要求用 ...

  9. ndk学习18: JNI之C&C++调用Java

    一.Java反射机制 先了解Java反射机制原理 例子网上很多,反射很灵活 二. 在JNI层调Java 用途: Java层逆向比较容易,增加逆向门槛,把调用都写到JNI层,  让Java层无调用关系 ...

  10. Fibonacci 2

    Fibonacci 2 感谢613的提供的题面 题目描述 给定\(S_0,S_1\),\(S_n=S_{n-1}+S_{n-2}+F_nF_{n-1}\),求\(S_n\bmod 2^{32}\). ...