Android: bitmap size exceeds VM budget holder

本文介绍了在Android应用中Gallery组件出现内存溢出(OutOfMemoryError)的问题,并提供了两种解决方案。一种是通过减小背景图的尺寸来临时解决问题,另一种是在Adapter中优化背景图的加载过程,避免内存泄漏。
部署运行你感兴趣的模型镜像

项目发现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));



您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值