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对象。
相关文章推荐
- Android缓存机制&缓存框架——ACache
- Android WebView缓存机制详解
- Android WebView缓存机制详解
- Android WebView缓存机制详解
- Android WebView缓存机制详解
- Android WebView缓存机制详解
- Android WebView缓存机制详解
- Android WebView缓存机制详解
- Android WebView缓存机制详解
- Android WebView缓存机制详解
- Android缓存机制详解之硬盘缓存DiskLruCache
- Android WebView缓存机制详解
- 【专题】Android WebView缓存机制详解
- Android JNI使用方法,JNI机制详解
- Android开发——Android 6.0权限管理机制详解
- 【Android进阶】Android 平滑图片加载和缓存库 Glide 使用详解
- memcached缓存机制+微软缓存机制使用详解
- Android Touch事件传递机制详解 下
- Android缓存机制&一个缓存框架推荐