對於lru演算法的理解
lru演算法,將命中率不高的空間釋放掉,保留命中率較高的空間。
這種演算法有一種實現方式:建立的物件通過佇列儲存起來,如果對乙個物件進行了訪問,就將這個物件放到佇列的開頭,新加入的物件也會放在佇列的開頭(也就是說,佇列開頭一定是新加入的或者是常用的物件)。當佇列長度超過了限額時,將佇列尾部的物件釋放即可。
對於lrucache的使用
在android中有lrucache類,該類使用了lru演算法對記憶體快取進行有效管理。lrucache是在android 3.1之後出來的,如果在老版本希望使用該類,需要使用v4包。
1. 建立lrucache物件,該類是乙個泛型類,value用來表明快取的資料型別
lrucache = new lrucache(max_size);引數表明快取的最大空間以byte為單位
by default, the cache size is measured in the number of entries. override sizeof(k, v) to size the cache in different units
官網指出,lrucache在檢測空間時是使用的元素個數作為單位的,比如:
lrucache.put("b0", bitmapfactory.decoderesource(getresources(), r.drawable.ic_launcher));
lrucache.put("b1", bitmapfactory.decoderesource(getresources(), r.drawable.ic_launcher));
此時,lrucache的大小為2,因為只快取了2個元素。
因此,我們需要重寫sizeof方法,使用元素的大小作為返回值
lrucache = new lrucache(max_size) {
@override
protected int sizeof(string key, bitmap value) {
// todo auto-generated method stub
return value.getbytecount();
2. 向快取中存入物件
lrucache.put("b0", bitmapfactory.decoderesource(getresources(), r.drawable.ic_launcher));
3. 從快取中取出快取物件
lrucache.get("b0")
如果,快取物件被銷毀了,返回null
對於disklrucache的使用
在android中還有乙個disklrucache類,該類使用lru演算法對磁碟快取進行管理
1. 將disklrucache檔案拷貝到專案中
2. 建立disklrucache物件
//引數1:用來快取的目錄
//引數2:應用程式版本
//引數3:the number ofvalues per cache entry. must be positive
//引數4:快取空間的大小,byte為單位
mdisklrucache = disklrucache.open(f, 1, 1, max_size);
3. 向快取寫入資料
3.1//設定快取的key,這個key會作為快取的檔名
disklrucache.editor editor = mdisklrucache.edit("f1");
3.2 建立輸出流
//newoutputstream(0)中的引數會作為檔名的字尾,表示從通道幾寫入的
outputstream outputstream = editor.newoutputstream(0);
3.3 向輸出流寫資料
bitmapfactory.decoderesource(getresources(), r.drawable.ic_launcher).compress(bitmap.compressformat.png, 0, outputstream);
3.4 提交
editor.commit();
4. 從快取中獲取資料
4.1 獲取key對應的 snapshot,如果空間被釋放,返回null
snapshot snapshot=disklrucache.get(key);
4.2 從snapshot中獲取輸入流,引數表示通道號,和
editor.newoutputstream(0)對應
snapshot.getinputstream(0)
文章選自華清遠見嵌入式培訓
>>>更多優秀技術博文每日更新
android 快取管理及LRU演算法
1 為什麼要用快取 快取是訪問資料的臨時地,因為取原始資料代價太大了,加了快取,可以取得快些。快取可以認為是原始資料的子集,它是從原始資料裡複製出來的,並且為了能被取回,被加上了標誌。在android開發中,經常要訪問網路資料比如大量網路,如果每次需要同一張都去網路獲取,這代價顯然太大了。可以考慮設...
android 快取管理及LRU演算法
1 為什麼要用快取 快取是訪問資料的臨時地,因為取原始資料代價太大了,加了快取,可以取得快些。快取可以認為是原始資料的子集,它是從原始資料裡複製出來的,並且為了能被取回,被加上了標誌。在android開發中,經常要訪問網路資料比如大量網路,如果每次需要同一張都去網路獲取,這代價顯然太大了。可以考慮設...
android 快取管理及LRU演算法
1 為什麼要用快取 快取是訪問資料的臨時地,因為取原始資料代價太大了,加了快取,可以取得快些。快取可以認為是原始資料的子集,它是從原始資料裡複製出來的,並且為了能被取回,被加上了標誌。在android開發中,經常要訪問網路資料比如大量網路,如果每次需要同一張都去網路獲取,這代價顯然太大了。可以考慮設...