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));



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值