setimageresource oom

本文探讨了在Android应用中使用ImageView的setImageresource方法可能导致的OOM问题,并提出了解决方案,即使用BitmapFactory.decodeStream方法替代,同时介绍了如何通过配置参数减少内存占用,避免outofMemory异常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

bugly报出的一个oom,当时看到很惊讶,使用setimageresource已经是家常便饭。

结合项目来说,当大量频繁的需要使用setImageresource时可能会出现oom,如果在小二不频繁下一般是不会报oom的。

查资料得到的信息:

这篇博客的地址,可能这个兄弟也遇到过这个情况。

https://blog.youkuaiyun.com/mouse12138/article/details/50983118


那是为什么,会导致oom呢:
  原来当使用像 imageView.setBackgroundResource,imageView.setImageResource, 或者 BitmapFactory.decodeResource 这样的方法来设置一张大图片的时候,这些函数在完成decode后,最终都是通过java层的createBitmap来完成的,需要消耗更多内存。
  因此,改用先通过BitmapFactory.decodeStream方法,创建出一个bitmap,再将其设为ImageView的 source,decodeStream最大的秘密在于其直接调用JNI>>nativeDecodeAsset()来完成decode,无需再使用java层的createBitmap,从而节省了java层的空间。如果在读取时加上图片的Config参数,可以跟有效减少加载的内存,从而跟有效阻止抛out of Memory异常。
  另外,需要特别注意:
  decodeStream是直接读取图片资料的字节码了, 不会根据机器的各种分辨率来自动适应,使用了decodeStream之后,需要在hdpi和mdpi,ldpi中配置相应的图片资源,否则在不同分辨率机器上都是同样大小(像素点数量),显示出来的大小就不对了。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值