Android中aCache缓存机制详解

来源:互联网 发布:js object 数组去重 编辑:程序博客网 时间:2024/06/05 02:23

ACache是一个为android制定的 轻量级的 开源缓存框架。 我们可以通过ACache缓存机制来实现对数据的缓存处理,下面通过一个实例来认识ACache缓存。

思路:我们在activity_main.xml中创建ListView布局,每一个item中放置初始数据,然后在MainActivity中对每一个item添加点击事件,在点击事件中将每一个item中的数据加入到ACache缓存中。最后再添加一个按钮,通过Intent跳转到SecondActivity中,而我们在SecondActivity界面中,就把缓存中的数据再提取出来,组成一个新的ListView.


首先我们需要自定义一个缓存类,我这里取名为item_acache,并且添加了三种方法,代码如下:

package com.example.test;import android.content.Context;import android.widget.ArrayAdapter;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;/** * Created by lenovo on 2017/10/30. */public class item_acache {    private static ArrayList<Map<String,Object>> data=new ArrayList<Map<String, Object>>();    //data是一个二维数组,数组中的每一个值都是一个Map类型的数据    public static void set_goods_Cache(Context context, Map<String,Object> list){        ACache aCache = ACache.get(context);        data.add(list);        aCache.put("goods_cache",data);        //把数据加入到缓存中,设置键为"goods_cache"    }    public static ArrayList<Map<String,Object>> get_goods_Cache(Context context){        ACache aCache = ACache.get(context);        ArrayList<Map<String,Object>> cache_goods = (ArrayList<Map<String,Object>>)aCache.getAsObject("goods_cache");        //aCache.getAsObject()通过该方法得到缓存中的数据,将类型强制转换为ArrayList<Map<String,Object>>        //因为在后文中我们就不用对ListView适配器一个一个添加数据,而是直接返回cache_goods对象        return cache_goods;    }    public static void add_goods_Cache(Context context,Object image,Object title,Object info){//加入一条商品信息到缓存中        Map<String,Object> cache_goods=new HashMap<String,Object>();        cache_goods.put("pic",image);        cache_goods.put("title",title);        cache_goods.put("info",info);        set_goods_Cache(context,cache_goods);//新加入的数据再存入缓存中    }
package com.example.test;import android.content.Intent;import android.support.annotation.IntDef;import android.support.v4.widget.DrawerLayout;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.util.Log;import android.view.View;import android.widget.AbsListView;import android.widget.AdapterView;import android.widget.ArrayAdapter;import android.widget.Button;import android.widget.ListView;import android.widget.NumberPicker;import android.widget.SimpleAdapter;import android.widget.Toast;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;public class MainActivity extends AppCompatActivity implements AdapterView.OnItemClickListener {    private ListView listView;    private SimpleAdapter simpleAdapter;    private List<Map<String,Object>> data;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        Button button=(Button)findViewById(R.id.enter);        button.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                Intent intent=new Intent(MainActivity.this,SecondActivity.class);                startActivity(intent);            }        });        listView=(ListView)findViewById(R.id.listView);        data=new ArrayList<Map<String, Object>>();        simpleAdapter=new SimpleAdapter(this,getData(),R.layout.item_layout,new String[]{"pic","title","info"},new int[]{R.id.pic,R.id.title,R.id.info});        //        SimpleAdapter//        context:上下文//        data:数据源(List<? extends Mao<String,?>> data)一个Map所组成的List集合//                每一个Map都会去对应ListView列表的一行//                每一个Map(键-值对)中的键必须包含所有在from中所制定的键//        resource:列表项的布局文件ID//        from:Map中的键名//        to:绑定数据视图中的ID,与from成对应关系        listView.setAdapter(simpleAdapter);        listView.setOnItemClickListener(this);    }    private List<Map<String,Object>> getData(){        for(int i=0;i<10;i++){            Map<String,Object>map=new HashMap<String, Object>();            map.put("pic",R.mipmap.ic_launcher);            map.put("title","chenwenhao"+i);            map.put("info","info"+i);            //在HashMap对象中通过map.put给每一个控件赋值            //第一个值为每一个控件对应的键            //第二个值为我手动给它赋的值            data.add(map);        }        return data;    }    @Override    public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {        HashMap<String, Object> map = (HashMap<String,Object>) adapterView                .getItemAtPosition(position);        //创建对象map获取每一个指定索引所得到的item        Toast.makeText(this,position+"",Toast.LENGTH_SHORT).show();        item_acache acache=new item_acache();        acache.add_goods_Cache(this,map.get("pic"),map.get("title"),map.get("info"));        //得到通过map.get()方法获得每一个键值所对应控件的值,比如map.get("pic"),得到索引为position的item的图片        //最后通过acache.add_goods_Cache将每一个item中的三个控件的值加入缓存(因为我每一个item定义的是三个控件),方法中第一个值为上下文    }}

以上代码是在MainActivity中给ListView添加数据,并且在点击事件中把数据加入缓存中,接下来我们在SecondActivity中来从缓存中提取数据并且放入到ListView中

package com.example.test;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.widget.ListView;import android.widget.SimpleAdapter;import android.widget.Toast;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;public class SecondActivity extends AppCompatActivity {    private SimpleAdapter simpleAdapter;    private ListView listView;    private List<Map<String,Object>> data;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_second);        data=new ArrayList<Map<String, Object>>();        listView=(ListView)findViewById(R.id.sec_view);        simpleAdapter=new SimpleAdapter(this,new item_acache().get_goods_Cache(this),R.layout.sec_item,new String[]{"pic","title","info"},new int[]{R.id.sec_pic,R.id.sec_title,R.id.sec_info});        listView.setAdapter(simpleAdapter);    }}

在SimpleAdapter的第二个参数中直接创建item_acache对象并且调用get_goods_Cache()方法得到缓存中的数据,在item_acache类中的get_goods_Cache()返回的是ArrayList对象,因此可以直接传到SimpleAdapter的第二个参数中。

最后需要提醒一点的是,ACache类文件需要去网上下载然后放在项目目录下,这样才能创建ACache对象。
这里写图片描述

原创粉丝点击