一、簡單介紹 LRUCache
1 Android的緩存主要就是內(nèi)存緩存和硬盤緩存亡哄。這兩種緩存機(jī)制的實現(xiàn)都用到了LRU算法湾宙。說到Lru其實是Least Recently Usead的縮寫幕庐, 翻譯過來就是最近(時間)最少使用讯榕。
LRU就是最近最少使用算法骤素,這里我們只講內(nèi)存緩存。2 LRUCache是Android中封裝好的緩存類愚屁,所以可以在Adroid中直接使用LRUCache來實現(xiàn)內(nèi)存緩存济竹,同時他也是泛型類,所以初始化的時候我們需要指定泛型霎槐。
3 LRUCache把算法的部分基本都扔給了LinkedHashMap送浊,通過LinkedHashMap來存儲最近使用過的對象的引用。當(dāng)內(nèi)存滿的時候會移除鏈表尾部的數(shù)據(jù)丘跌,即最不常用的數(shù)據(jù)袭景。
二、簡單介紹LRUCache的使用
- 1 設(shè)置LRUCache的緩存大小闭树;
int maxMemory = (int) (Runtime.getRuntime().totalMemory()/1024);
//設(shè)置緩存當(dāng)前進(jìn)程可用容量的1/8
int cacheSize = maxMemory/8;
- 2 定義LRUCache耸棒,指定泛型,并初始化LruCache
//這里的是Integer類型,保存的數(shù)據(jù)是String類型蔼啦,鍵和值不允許為null
private LruCache<Integer,String> mData;
mData = new LruCache<Integer,String>(cacheSize);
- 3 存儲數(shù)據(jù),LRUCache提供了put(key仰猖,value)方法來存儲數(shù)據(jù)捏肢,這個方法是通過鍵(key)值(value)對來存儲數(shù)據(jù)的。存儲的數(shù)據(jù)就是value對應(yīng)的數(shù)據(jù)饥侵。
mData.put(1,"程序員");
mData.put(2,"寫代碼");
mData.put(3,"吃飯");
mData.put(4,"睡覺");
這里存儲了4條數(shù)據(jù)鸵赫。
- 4 讀取數(shù)據(jù),LRUCache提供了get(key)方法來讀取數(shù)據(jù)躏升,這里key就是存儲數(shù)據(jù)用到的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);
這樣就讀取出了我們之前存儲的數(shù)據(jù)。
注意事項
- 1 你要存儲的數(shù)據(jù)的單位要和要和LRUCache的緩存的單位一樣膨疏。
- 2 你可以通過覆寫LRUCache的sizeOf(key,value)方法來定義儲存對象的大小一睁,例如如果你要存儲Bitmap類型的數(shù)據(jù):
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來實現(xiàn)存儲數(shù)據(jù),讀取數(shù)據(jù)佃却,展示數(shù)據(jù)
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);
//展示數(shù)據(jù)的TextView
show = (TextView)findViewById(R.id.LruText);
//存儲和得到數(shù)據(jù)的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(){
//設(shè)置LruCache的最大緩存
int maxMemory = (int)(Runtime.getRuntime().totalMemory()/1024);
int cacheSize = maxMemory/8;
//LruCache的初始化
mData = new LruCache<Integer,String>(cacheSize);
//添加數(shù)據(jù)
mData.put(1,"程序員");
mData.put(2,"寫代碼");
mData.put(3,"吃飯");
mData.put(4,"睡覺");
}
public String getData(){
String data = "";
//獲取數(shù)據(jù)
for(int i = 1;i<6;i++){
data += mData.get(i) + "\n";
}
return data;
}
public void showData(String data){
//展示數(shù)據(jù)
show.setText(data);
}
}
這里有兩個Button者吁,一個用于存儲數(shù)據(jù),一個用于展示讀取的數(shù)據(jù)饲帅,還有一個TextView用于展示數(shù)據(jù)复凳。
我們來看看效果:
image.png
這樣我們就展示出了數(shù)據(jù)