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);  
    }  
      
    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();  
    }  
} 
原文:http://www.cnblogs.com/renjiemei1225/p/7573399.html