教育资源为主的文档平台

当前位置: 查字典文档网> 所有文档分类> IT计算机> 手机开发> Android 开发:缓存机制与实现

Android 开发:缓存机制与实现

上传者:刘兴家
|
上传时间:2016-09-06
|
次下载

Android 开发:缓存机制与实现

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主要代码如下:

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()方法,如图所示

 

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

版权声明:此文档由查字典文档网用户提供,如用于商业用途请与作者联系,查字典文档网保持最终解释权!

下载文档

热门试卷

2016年四川省内江市中考化学试卷
广西钦州市高新区2017届高三11月月考政治试卷
浙江省湖州市2016-2017学年高一上学期期中考试政治试卷
浙江省湖州市2016-2017学年高二上学期期中考试政治试卷
辽宁省铁岭市协作体2017届高三上学期第三次联考政治试卷
广西钦州市钦州港区2016-2017学年高二11月月考政治试卷
广西钦州市钦州港区2017届高三11月月考政治试卷
广西钦州市钦州港区2016-2017学年高一11月月考政治试卷
广西钦州市高新区2016-2017学年高二11月月考政治试卷
广西钦州市高新区2016-2017学年高一11月月考政治试卷
山东省滨州市三校2017届第一学期阶段测试初三英语试题
四川省成都七中2017届高三一诊模拟考试文科综合试卷
2017届普通高等学校招生全国统一考试模拟试题(附答案)
重庆市永川中学高2017级上期12月月考语文试题
江西宜春三中2017届高三第一学期第二次月考文科综合试题
内蒙古赤峰二中2017届高三上学期第三次月考英语试题
2017年六年级(上)数学期末考试卷
2017人教版小学英语三年级上期末笔试题
江苏省常州西藏民族中学2016-2017学年九年级思想品德第一学期第二次阶段测试试卷
重庆市九龙坡区七校2016-2017学年上期八年级素质测查(二)语文学科试题卷
江苏省无锡市钱桥中学2016年12月八年级语文阶段性测试卷
江苏省无锡市钱桥中学2016-2017学年七年级英语12月阶段检测试卷
山东省邹城市第八中学2016-2017学年八年级12月物理第4章试题(无答案)
【人教版】河北省2015-2016学年度九年级上期末语文试题卷(附答案)
四川省简阳市阳安中学2016年12月高二月考英语试卷
四川省成都龙泉中学高三上学期2016年12月月考试题文科综合能力测试
安徽省滁州中学2016—2017学年度第一学期12月月考​高三英语试卷
山东省武城县第二中学2016.12高一年级上学期第二次月考历史试题(必修一第四、五单元)
福建省四地六校联考2016-2017学年上学期第三次月考高三化学试卷
甘肃省武威第二十三中学2016—2017学年度八年级第一学期12月月考生物试卷

网友关注视频

沪教版牛津小学英语(深圳用)五年级下册 Unit 1
沪教版牛津小学英语(深圳用) 四年级下册 Unit 12
七年级英语下册 上海牛津版 Unit9
每天日常投篮练习第一天森哥打卡上脚 Nike PG 2 如何调整运球跳投手感?
二年级下册数学第三课 搭一搭⚖⚖
冀教版小学数学二年级下册第二单元《余数和除数的关系》
人教版二年级下册数学
苏科版数学 八年级下册 第八章第二节 可能性的大小
【获奖】科粤版初三九年级化学下册第七章7.3浓稀的表示
冀教版英语三年级下册第二课
北师大版数学四年级下册3.4包装
外研版英语七年级下册module1unit3名词性物主代词讲解
化学九年级下册全册同步 人教版 第18集 常见的酸和碱(二)
外研版英语七年级下册module3 unit2第一课时
【部编】人教版语文七年级下册《老山界》优质课教学视频+PPT课件+教案,安徽省
外研版英语七年级下册module3 unit1第二课时
人教版历史八年级下册第一课《中华人民共和国成立》
北师大版数学 四年级下册 第三单元 第二节 小数点搬家
冀教版小学英语四年级下册Lesson2授课视频
3.2 数学二年级下册第二单元 表内除法(一)整理和复习 李菲菲
冀教版小学数学二年级下册第二周第2课时《我们的测量》宝丰街小学庞志荣
第五单元 民族艺术的瑰宝_15. 多姿多彩的民族服饰_第二课时(市一等奖)(岭南版六年级上册)_T129830
冀教版小学数学二年级下册第二单元《有余数除法的竖式计算》
【部编】人教版语文七年级下册《泊秦淮》优质课教学视频+PPT课件+教案,广东省
第五单元 民族艺术的瑰宝_16. 形形色色的民族乐器_第一课时(岭南版六年级上册)_T3751175
河南省名校课堂七年级下册英语第一课(2020年2月10日)
外研版英语三起6年级下册(14版)Module3 Unit2
《空中课堂》二年级下册 数学第一单元第1课时
沪教版牛津小学英语(深圳用) 五年级下册 Unit 12
外研版英语三起6年级下册(14版)Module3 Unit1