幽映每白日,清辉照衣裳。这篇文章主要讲述android 缓存图片相关的知识,希望能为你提供帮助。
【android 缓存图片】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();
}
}
推荐阅读
- 安卓startActivityForResult用法
- Android Studio 设置自动生成单例代码
- Android之利用EventBus进行消息传递
- 安卓发环境的搭建
- Java中的可重入监视器
- 线程优先级(Thread Priority)
- Java线程命名和当前线程
- Java线程的生命周期(线程状态)
- Java线程池介绍和实例