zoukankan      html  css  js  c++  java
  • 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()方法,如图所示

     

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

    作者:杰瑞教育
    出处:http://www.cnblogs.com/jerehedu/ 
    本文版权归烟台杰瑞教育科技有限公司和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
     
  • 相关阅读:
    从Android APP里面打开其他应用
    jQuery 中 serialize() 方法会受到asp.net 页面影响
    javascript 对象转换 json 的插件
    MVC 4将jQuery升级到1.9出现各种问题。。。
    用MVC做可拖拽的留言板,利用 Jquery模板 JsRender
    未能加载文件或程序集“Microsoft.ReportViewer.WebForms, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a”
    处理MVC中默认的Json方法返回时间的问题
    jQuery 中使用$.post 无法获取 json
    MVC中用 BundleCollection 压缩CSS时图片路径问题
    MVC中返回Json的几种声明方式
  • 原文地址:https://www.cnblogs.com/jerehedu/p/4263649.html
Copyright © 2011-2022 走看看