您的位置:首页 > 移动开发 > Android开发

Android中aCache缓存机制详解

2017-11-02 23:31 225 查看

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对象。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: