很多的时候,我们使用Bitmap不会出现多大的问题。但是当机器资源不够的情况下,很多应用都会报出 OutOfMemoryError,当然报出这样的异常往往是给Bitmap分配内存时内存不足引起的。即便是很小的一个图片,也会有出错,如何解决呢?
我的解决办法如下:
public static Bitmap createBitmap(int width, int height, Bitmap.Config config) {
Bitmap bitmap = null;
try {
bitmap = Bitmap.createBitmap(width, height, config);
} catch (OutOfMemoryError e) {
while(bitmap == null) {
System.gc();
System.runFinalization();
bitmap = createBitmap(width, height, config);
}
}
}
经过最近不断的实验证明,当内存泄漏很大的时候,上述方法根本无法避免内存溢出。其实避免内存溢出还是要靠平时写代码的时候自己去注意。很多时候的溢出主要是因为Bitmap和Drawable资源没被释放造成的,尤其是当项目中图片资源很多的时候,这个问题尤为突出。
解决办法:当CreateBitmap之后,当这个Bitmap用完之后,那需要recycle这个资源。
还有当需要更换图片的背景资源的时候需要使用到Drawable,当需要更换那个Drawable时,原来的Drawable需要setCallback(null)
如:
Bitmap bm = BitmapFactory.decodeResource(this.getResources(),R.drawable.splash);
BitmapDrawable bd = new BitmapDrawable(this.getResources(),bm);
mBtn.setBackgroundDrawable(bd);
来代替mBtn.setBackgroundResource(R.drawable.splash)。
销毁的时候使用:
BitmapDrawable bd = (BitmapDrawable)mBtn.getBackground();
mBtn.setBackgroundResource(0);//别忘了把背景设为null,避免onDraw刷新背景时候出现used arecycled bitmap错误
bd.setCallback(null);
bd.getBitmap().recycle();
如果你有更好的解决办法,可以一起讨论。
andriod 的bitmap 真是个大胖子,操作稍有不当,就会引发OutOfMemoryError
提供几种管理bitmap的方法,以便记录1.加载多个bitmap时候即时调用recycle()释放资源
2.加载比较大的图片时使用 BitmapFactory.Options按比例缩放图片,即时调用recycle()释放资源
3.加载单独图片时尽可能的少生成bitmap对象,比如我的一个界面需显示一个图片(如果每次加载的图片不同),将bitmap对象用static修饰,每次加载该界面的时候先进行释放处理,然后在重新加载
if(bitmap!=null&&!bitmap.isRecycled()){
}
总之只要是涉及到bitmap的地方,做好释放的操作。
以上是本人在工程里管理bitmap的几种方法,不知道对你有木有用,我反正是用了