一、简单介绍 LRUCache
1 Android的缓存主要就是内存缓存和硬盘缓存。这两种缓存机制的实现都用到了LRU算法。说到Lru其实是Least Recently Usead的缩写, 翻译过来就是最近(时间)最少使用。
LRU就是最近最少使用算法,这里我们只讲内存缓存。2 LRUCache是Android中封装好的缓存类,所以可以在Adroid中直接使用LRUCache来实现内存缓存,同时他也是泛型类,所以初始化的时候我们需要指定泛型。
3 LRUCache把算法的部分基本都扔给了LinkedHashMap,通过LinkedHashMap来存储最近使用过的对象的引用。当内存满的时候会移除链表尾部的数据,即最不常用的数据。
二、简单介绍LRUCache的使用
- 1 设置LRUCache的缓存大小;
int maxMemory = (int) (Runtime.getRuntime().totalMemory()/1024);
//设置缓存当前进程可用容量的1/8
int cacheSize = maxMemory/8;
- 2 定义LRUCache,指定泛型,并初始化LruCache
//这里的是Integer类型,保存的数据是String类型,键和值不允许为null
private LruCache<Integer,String> mData;
mData = new LruCache<Integer,String>(cacheSize);
- 3 存储数据,LRUCache提供了put(key,value)方法来存储数据,这个方法是通过键(key)值(value)对来存储数据的。存储的数据就是value对应的数据。
mData.put(1,"程序员");
mData.put(2,"写代码");
mData.put(3,"吃饭");
mData.put(4,"睡觉");
这里存储了4条数据。
- 4 读取数据,LRUCache提供了get(key)方法来读取数据,这里key就是存储数据用到的key。
String data1 = mData.get(1);
String data2 = mData.get(2);
String data3 = mData.get(3);
String data4 = mData.get(4);
String data5 = mData.get(5);
这样就读取出了我们之前存储的数据。
注意事项
- 1 你要存储的数据的单位要和要和LRUCache的缓存的单位一样。
- 2 你可以通过覆写LRUCache的sizeOf(key,value)方法来定义储存对象的大小,例如如果你要存储Bitmap类型的数据:
LruCache<String,Bitmap>mMemoryCache;
//这里最大缓存的单位是kb
int maxMemory = (int) (Runtime.getRuntime().totalMemory()/1024);
int cacheSize = maxMemory/8;
mMemoryCache = new LruCache<String,Bitmap>(cacheSize){
@Override
protected int sizeOf(String key, Bitmap value) {
return value.getByteCount()/1024;
}
};
这里我们写一个小demo来实现存储数据,读取数据,展示数据
public class LRUCacheActivity extends AppCompatActivity {
//定义LruCache
private LruCache<Integer,String>mData;
private TextView show;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_lrucache);
//展示数据的TextView
show = (TextView)findViewById(R.id.LruText);
//存储和得到数据的Button
Button save = (Button)findViewById(R.id.LRUSaveData);
Button get =(Button)findViewById(R.id.getLRUData);
save.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
saveData();
}
});
get.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
showData(getData());
}
});
}
public void saveData(){
//设置LruCache的最大缓存
int maxMemory = (int)(Runtime.getRuntime().totalMemory()/1024);
int cacheSize = maxMemory/8;
//LruCache的初始化
mData = new LruCache<Integer,String>(cacheSize);
//添加数据
mData.put(1,"程序员");
mData.put(2,"写代码");
mData.put(3,"吃饭");
mData.put(4,"睡觉");
}
public String getData(){
String data = "";
//获取数据
for(int i = 1;i<6;i++){
data += mData.get(i) + "\n";
}
return data;
}
public void showData(String data){
//展示数据
show.setText(data);
}
}
这里有两个Button,一个用于存储数据,一个用于展示读取的数据,还有一个TextView用于展示数据。
我们来看看效果:
这样我们就展示出了数据