以下示例显示,在LRUCache之外分配新空间时,使用有限大小的LRUCache会导致内存不足错误。
特性:
64MB进程大小; 10MB LRUCache大小;我在循环中放入LRUCache的1MB块。
经过57(64MB-7MB)次尝试,我得到:
05-15 09:05:51.385: E/AndroidRuntime(11630): FATAL EXCEPTION: main
05-15 09:05:51.385: E/AndroidRuntime(11630): java.lang.OutOfMemoryError
05-15 09:05:51.385: E/AndroidRuntime(11630): at com.example.testlrucachewithpathes.MyDataClass.<init>(MyDataClass.java:14)
在lrucache.evictall()之后,将释放缓存,并且有足够的空间可再次分配。但是我想那不是办法。
有什么提示吗?
这是我的代码:
public class StartActivity extends Activity {
int iMegabyte=1000000;
LruCache<String, Object> nativelrucache=new LruCache<String, Object>(iMegabyte*10);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_start);
// Do my stuff
Log.v("MEMORY STATE", getMemoryStatus());
// Case with MyDataClass ------------------------------------------------------------------------------------
for(int i=0;i<100;i++){
MyDataClass mdataclass=new MyDataClass(iMegabyte);
//lrucachemanager.put("ID_" + i, mdataclass);
Log.v("MEMORY STATE", "put data into cache : " + i);
nativelrucache.put("ID_" + i, mdataclass);
//nativelrucache.evictAll();
}
}
}
public class MyDataClass {
byte[] bytes;
public MyDataClass(int iSize){
//Arrays.fill( bytes, 0 );
bytes=new byte[iSize];
}
}
最佳答案
来自http://developer.android.com/reference/android/util/LruCache.html
默认情况下,缓存大小以条目数衡量。
覆盖sizeOf(K,V)以不同单位调整缓存大小。
因此,您应该执行以下操作:
LruCache<String, MyDataClass> nativelrucache=new LruCache<String, MyDataClass>(iMegabyte*10){
protected int sizeOf(String key, MyDataClass value) {
return value.bytes.length;
};
};
关于android - LRUCache无法正常工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23671687/