Android: bitmap size exceeds VM budget holder
项目发现OOM,在设置backgroundResource的时候
adapter.getView()方法中的出错代码行(convertView已经重用):
holder.relativeLayout.setBackgroundResource(imageIDs[6-position]); // occur OOM ...
项目说明: 项目中有一个gallery里面要放7张背景图(代表七个页面),
临时解决方法:
把背景图换成 小图片(480X320左右大小)
尝试方法1:
adapter里面添加:
private Bitmap currentBg = null;
再加新方法:
private void setBgForView(int index){
if(currentBg != null && (currentBg.isRecycled() == false)){
currentBg.recycle();
currentBg = null;
}
Drawable temp = context.getResources().getDrawable(imageIDs[index]);
currentBg = ((BitmapDrawable)temp).getBitmap();
}
然后在getView方法中添加:
setBgForView(6-position);
holder.relativeLayout.setBackgroundDrawable(new BitmapDrawable(currentBg));
结果:
02-27 16:45:36.393: E/AndroidRuntime(1466): java.lang.RuntimeException: Canvas: trying to use a recycled bitmap android.graphics.Bitmap@406da718
02-27 16:45:36.393: E/AndroidRuntime(1466): at android.graphics.Canvas.throwIfRecycled(Canvas.java:955)
02-27 16:45:36.393: E/AndroidRuntime(1466): at android.graphics.Canvas.drawBitmap(Canvas.java:1044)
解决方法2:
use new method:
private void getBgImage(int index ){
//注意这里没有必要手动去 currentBg.recycle();如果 调用了,会发现跟上面一样的异常
Drawable d;
try
{
currentBg = Bitmap.createBitmap(320,424,Bitmap.Config.RGB_565);
currentBg.eraseColor(0xFFFFFFFF);
Rect r = new Rect(0, 0,320 , 424);
Canvas c = new Canvas(currentBg);
Paint p = new Paint();
p.setColor(0xFFC0C0C0);
c.drawRect(r, p);
d = context.getResources().getDrawable(imageIDs[index]);
d.setBounds(r);
d.draw(c);
}
catch (Exception e){
e.printStackTrace();
}
}
然后在getView方法中调用 :
getBgImage(6-position);
holder.relativeLayout.setBackgroundDrawable(new BitmapDrawable(currentBg));
更多相关文章
- 没有一行代码,「2020 新冠肺炎记忆」这个项目却登上了 GitHub 中
- 不吹不黑!GitHub 上帮助人们学习编码的 12 个资源,错过血亏...
- android下使用adb启动程序或者服务
- Android(安卓)Ant Build 遇到的问题
- Android中不用Service跨Avtivity仍然可以播放音乐的一个简单方法
- Android(安卓)学习笔记之二 Netspeed
- Android错误解决方法之:Debug certificate expired on
- Android(安卓)requires compiler compliance level 5.0 or 6.0.
- Android(安卓)dispatchTouchEvent