免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3172 | 回复: 0
打印 上一主题 下一主题

Android 中的缓存机制与实现(杰瑞教育原创) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-02-03 08:59 |只看该作者 |倒序浏览
  Android开发本质上就是手机和互联网中的web服务器之间进行通信,就必然需要从服务端获取数据,而反复通过网络获取数据是比较耗时的,特别是访问比较多的时候,会极大影响了性能,Android中可通过二级缓存来减少频繁的网络操作,减少流量、提升性能。
一、二级缓存工作机制
  所谓二级缓存实际上并不复杂,当Android端需要获得数据时比如获取网络中的图片,我们首先从内存中查找(按键查找),内存中没有的再从磁盘文件或sqlite中去查找,若磁盘中也没有才通过网络获取;当获得来自网络的数据,就以key-value对的方式先缓存到内存(一级缓存),同时缓存到文件或sqlite中(二级缓存)。注意:内存缓存会造成堆内存泄露,所有一级缓存通常要严格控制缓存的大小,一般控制在系统内存的1/4。
  理解了二级缓存大家可能会有个问题网络中的数据是变化的,数据一旦放入缓存中,再取该数据就是从缓存中获得,这样岂不是不能体现数据的变化?我们在缓存数据时会设置有效时间,比如说30分钟,若超过这个时间数据就失效并释放空间,然后重新请求网络中的数据。有的童鞋就问30分钟内咋办?那好吧,我也没招了,只有下拉刷新了, 实际上这不是问题。
二、二级缓存的实现
  如何实现二级缓存,有很多技术方案,在这里我们使用 ASimpleCache框架来给大家演示一下,通过名字就可以看出它是很容易实现的。
1、ACache介绍
  ASimpleCache是一个轻量级的开源cache框架,实际上就是一个叫ACache的java类。已经在商业项目中使用,运行效果不错。
2、ACache使用
  我们先做一个实现数据缓存的案例,然后再归纳一下主要的方法
  编写NewsListActivity主要代码如下:
Java Code复制内容到剪贴板
  • public class NewsListActivity extends Activity {  
  •     private List<News> list;  
  •     private ListView listView;  
  •     private LoadImageAdapter adapter;//适配器  
  •     private ACache acache;//缓存框架  
  •     @Override  
  •     protected void onCreate(Bundle savedInstanceState) {  
  •         // TODO Auto-generated method stub  
  •         super.onCreate(savedInstanceState);  
  •         super.setContentView(R.layout.load_img_listview_activity);  
  •         acache=ACache.get(this);//创建ACache组件  
  •         initView();//初始化界面,代码不贴了  
  • }  
  •   
  • public void loadData(){  
  •         String cacheData=acache.getAsString("newsList");//从缓存中取数据  
  •         if(cacheData!=null){//如果缓存中有,就不访问网络  
  • List<News> newsList=gson.fromJson(cacheData, new TypeToken<List<News>>(){}.getType());//将json转为List  
  •             list.addAll(newsList);  
  •             adapter.notifyDataSetChanged();  
  •             return;  
  •         }  
  •         new Thread(new Runnable() {  
  •             @Override  
  •             public void run() {  
  •                 // TODO Auto-generated method stub  
  •                 SystemClock.sleep(2000);//模拟网络耗时  
  •                 String json=request();//模拟从网络中获取json数据  
  •                 acache.put("newslist", json, 60*60*1);//将数据存入缓存中,有效时间设置为1小时  
  •                 List<News> newsList=gson.fromJson(json, new TypeToken<List<News>>(){}.getType());  
  •                 list.addAll(newsList);  
  •                 handler.sendEmptyMessage(1);  
  •             }  
  •               
  •         }).start();  
  • }  
  •     /**
  •      * 模拟网络请求方法
  •      * @return json数据
  •      */  
  • private String request(){  
  •         News news=null;  
  •         for(int i=0;i<10;i++){  
  •             news=new News();  
  •             news.setId(i);  
  •             news.setImgUrl("course/img/face_"+i+".png");  
  •             news.setTitle("新闻标题"+i);  
  •             news.setSummary("测试"+i);  
  •             list.add(news);  
  •         }  
  •         Gson gson=new Gson();  
  •         return gson.toJson(list);      
  • }  
  •   
  • private Handler handler=new Handler()  
  •         @Override  
  •         public void handleMessage(Message msg) {  
  •             // TODO Auto-generated method stub  
  •             switch(msg.what){  
  •                 case 1:  
  •                     notify_layout.setVisibility(View.GONE);  
  •                     adapter.notifyDataSetChanged();  
  •                 break;  
  •             }  
  •         }  
  • }  


  红色部分就是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()方法,如图所示
  根据不同存入数据,调用不同的方法取数据

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

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP