我的应用程序正在使用位图,每次用户进入特定活动时,它会在第二次停止工作时显示图像。
Bitmap bm = BitmapFactory.decodeFile(Environment.getExternalStorageDirectory()+"//Pics/"Image.jpg");
我尝试过使用像......这样的东西。
BitmapFactory.Options options = new BitmapFactory.Options();
options.inTempStorage = new byte[16*1024];
不确定要设置什么。但这没有帮助。一旦用户离开此活动,是否有办法清除位图等?感谢
答案 0 :(得分:8)
完成使用位图释放内存后调用Bitmap.recycle()。
答案 1 :(得分:8)
除了按照建议使用Bitmap.recycle()之外(这不适合所有情况而且颈部疼痛要问:“我还需要这个位图吗?”),I总是使用这种非常好的技术:
// 1. create a cache map
private WeakHashMap<String, SoftReference<Bitmap>> mCache;
如您所见,它是WeakReference
的散列图,其中SoftReference
为值。
//2. when you need a bitmap, ask for it:
public Bitmap get(String key){
if( key == null ){
return null;
}
if( mCache.containsKey(key) ){
SoftReference<Bitmap> reference = mCache.get(key);
Bitmap bitmap = reference.get();
if( bitmap != null ){
return bitmap;
}
return decodeFile(key);
}
// the key does not exists so it could be that the
// file is not downloaded or decoded yet...
File file = new File(Environment.getExternalStorageDirectory(), key);
if( file.exists() ){
return decodeFile(key);
} else{
throw new RuntimeException("Boooom!");
}
}
这将检查缓存映射。如果文件已经解码,则会返回;否则它将被解码和缓存。
//3. the decode file will look like this in your case
private Bitmap decodeFile(String key) {
Bitmap bitmap = BitmapFactory.decodeFile(Environment.getExternalStorageDirectory()+"//Pics/"+key);
mCache.put(key, new SoftReference<Bitmap>(bitmap));
return bitmap;
}
使用软引用很好,因为您将位图从内存中删除的责任转移到操作系统。
答案 2 :(得分:1)
请注意。 当我们考虑软引用时,我们认为操作系统会在报告outofmemory异常之前从memrory中删除softreferenced对象。
在android中,这并非总是如此。我必须为图像实现自己的缓存系统,我可以向你保证,当内存几乎已满时,软件引用的对象不会从内存中删除。
最后我不得不切换到硬引用(正常引用),但使用android.support.v4.util.LruCache来管理缓存对象。我会在lru缓存的onRemoved回调上调用recycle。它的定义更方便。
干杯。