Android中aCache缓存机制详解

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> data=new ArrayList>();
    //data是一个二维数组,数组中的每一个值都是一个Map类型的数据
    public static void set_goods_Cache(Context context, Map list){
        ACache aCache = ACache.get(context);
        data.add(list);
        aCache.put("goods_cache",data);
        //把数据加入到缓存中,设置键为"goods_cache"
    }
    public static ArrayList> get_goods_Cache(Context context){
        ACache aCache = ACache.get(context);
        ArrayList> cache_goods = (ArrayList>)aCache.getAsObject("goods_cache");
        //aCache.getAsObject()通过该方法得到缓存中的数据,将类型强制转换为ArrayList>
        //因为在后文中我们就不用对ListView适配器一个一个添加数据,而是直接返回cache_goods对象
        return cache_goods;
    }
    public static void add_goods_Cache(Context context,Object image,Object title,Object info){//加入一条商品信息到缓存中
        Map cache_goods=new HashMap();
        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> 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>();
        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> data)一个Map所组成的List集合
//                每一个Map都会去对应ListView列表的一行
//                每一个Map(键-值对)中的键必须包含所有在from中所制定的键
//        resource:列表项的布局文件ID
//        from:Map中的键名
//        to:绑定数据视图中的ID,与from成对应关系
        listView.setAdapter(simpleAdapter);
        listView.setOnItemClickListener(this);
    }
    private List> getData(){
        for(int i=0;i<10;i++){
            Mapmap=new HashMap();
            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 map = (HashMap) 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> data;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        data=new ArrayList>();
        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对象。
Android中aCache缓存机制详解_第1张图片

你可能感兴趣的:(一个程序员的爬坑之路)