画像のロードとキャッチに画像ローダー クラスを使用していますが、メモリ サイズに問題があり、以下のような logcat メッセージが発生し、アプリケーションが実行をフリーズするまで、なぜこれが起こっているのかわかりません。
10-11 14:11:22.735: I/MemoryCache(859): MemoryCache will use up to 125.0MB
10-11 14:11:22.735: I/MemoryCache(859): MemoryCache will use up to 125.0MB
10-11 14:11:22.745: I/MemoryCache(859): MemoryCache will use up to 125.0MB
10-11 14:11:22.755: I/MemoryCache(859): MemoryCache will use up to 125.0MB
10-11 14:11:22.755: I/MemoryCache(859): MemoryCache will use up to 125.0MB
10-11 14:11:22.765: I/MemoryCache(859): MemoryCache will use up to 125.0MB
10-11 14:11:22.775: I/MemoryCache(859): MemoryCache will use up to 125.0MB
10-11 14:11:22.775: I/MemoryCache(859): MemoryCache will use up to 125.0MB
10-11 14:11:22.784: I/MemoryCache(859): MemoryCache will use up to 125.0MB
10-11 14:11:22.795: I/MemoryCache(859): MemoryCache will use up to 125.0MB
10-11 14:11:22.795: I/MemoryCache(859): MemoryCache will use up to 125.0MB
10-11 14:11:22.806: I/MemoryCache(859): MemoryCache will use up to 125.0MB
10-11 14:11:22.814: I/MemoryCache(859): MemoryCache will use up to 125.0MB
10-11 14:11:22.814: I/MemoryCache(859): MemoryCache will use up to 125.0MB
10-11 14:11:22.824: I/MemoryCache(859): MemoryCache will use up to 125.0MB
10-11 14:11:22.824: I/MemoryCache(859): MemoryCache will use up to 125.0MB
10-11 14:11:22.834: I/MemoryCache(859): MemoryCache will use up to 125.0MB
これが私のメモリキャッチクラスです
public class MemoryCache {
private static final String TAG = "MemoryCache";
private Map<String, Bitmap> cache=Collections.synchronizedMap(
new LinkedHashMap<String, Bitmap>(10,1.5f,true));//Last argument true for LRU ordering
private long size=0;//current allocated size
private long limit=1000000;//max memory in bytes
public MemoryCache(){
//use 25% of available heap size
setLimit(Runtime.getRuntime().maxMemory()/4);
//setLimit(Runtime.getRuntime().maxMemory()/4);
}
public void setLimit(long new_limit){
limit=new_limit;
Log.i(TAG, "MemoryCache will use up to "+limit/1024./1024.+"MB");
}
public Bitmap get(String id){
try{
if(!cache.containsKey(id))
return null;
//NullPointerException sometimes happen here http://code.google.com/p/osmdroid/issues/detail?id=78
return cache.get(id);
}catch(NullPointerException ex){
ex.printStackTrace();
return null;
}
}
public void put(String id, Bitmap bitmap){
try{
if(cache.containsKey(id))
size-=getSizeInBytes(cache.get(id));
cache.put(id, bitmap);
size+=getSizeInBytes(bitmap);
checkSize();
}catch(Throwable th){
th.printStackTrace();
}
}
private void checkSize() {
Log.i(TAG, "cache size="+size+" length="+cache.size());
if(size>limit){
Iterator<Entry<String, Bitmap>> iter=cache.entrySet().iterator();//least recently accessed item will be the first one iterated
while(iter.hasNext()){
Entry<String, Bitmap> entry=iter.next();
size-=getSizeInBytes(entry.getValue());
iter.remove();
if(size<=limit)
break;
}
Log.i(TAG, "Clean cache. New size "+cache.size());
}
}
public void clear() {
try{
//NullPointerException sometimes happen here http://code.google.com/p/osmdroid/issues/detail?id=78
cache.clear();
size=0;
}catch(NullPointerException ex){
ex.printStackTrace();
}
}
long getSizeInBytes(Bitmap bitmap) {
if(bitmap==null)
return 0;
return bitmap.getRowBytes() * bitmap.getHeight();
}
}
Asynctaskメカニズムを使用してリストビューでこの画像を呼び出していますあなたの助けは私にとって素晴らしいことですありがとう