关于解决Activity设置图片背景和ImageView设置帧动画引发的OOM的解决

近期在工作中,由于Activity的背景图片均为1280 * 720大小的,引发了一系列的OOM问题。做了一些处理,心得如下:

1.首先为什么会出现OOM呢。对于一张1280 * 720的图片,它应该占多大的内存呢?

一张图片(bitmap)占用的内存大小大概等于图片的长度 * 图片的宽度(像素)* 单位像素所占用的字节数。而单位像素所占用的字节数,官网文档如下:

2.那么应该如何解决该问题呢?

首先出现OOM的原因是相应的Activity使用完该背景图片后,并没有释放掉对该图片的引用,系统并不可以去回收该图片资源,因此首先想到了手动的在该 Activity销毁的时候setBackgroundResource为0(相当于remove掉该背景),但是后期发现这样做的效果并不明显,GC并没有及时的回收掉资源。又重新查资料,想到每次销毁的时候都去获取到背景的bitmap,手动的recycle一下。代码如下:

这样解决以后,OOM的问题得到了很大程度上的解决,但是同时又出现了另一个问题:

那为什么出现该问题呢?
3.为什么出现trying to use a recycled bitmap 的异常
因为我们在recycle时有可能该Activity还在使用该背景图片,因此引起了该异常。那么应该如何解决呢,我的大概想法是,在recycle之前,先将Activity和背景图片的引用关系解开再去recycle图片。如下:

大致可以解决掉以上问题。以上即为我解决掉这个bug的一些分享。大家如果有更好的解决办法,请告知我一声,谢啦。

对于帧动画,解决方法类似,代码如下:

如有错误。请及时指出,谢谢。

时间: 2024-08-29 04:06:12

关于解决Activity设置图片背景和ImageView设置帧动画引发的OOM的解决的相关文章

防盗链Nginx设置图片防盗链,设置无效的请仔细看红字

*******************************************************************切记,替换的图片地址要使用没有防盗链的网站图片,否则由于替换的图片其实也处于防盗链情况下,会造成仍旧无法显示设置的图片.******************************************************************* 一.全站图片防盗链 在/usr/local/nginx/conf/nginx.conf文件要添加防盗链的ser

Android 在onActivityResult()中设置图片setImageResource(resId) 或者改变view属性,不成功的解决办法

如果试验过的朋友就会发现,在onActivityResult()中设置这些属性,好像都不工作,虽然我死磕一番还是不知道具体原因,我直接默认它可能就是不能在里面设置,所以就只能在其他地方设置,幸好发现Activity的onResume()方法是在onActivityResult()方法调用之后的,所以,我们可以在onActivityResult()中获取数据,然后在OnResume()中设置属性.OK!

IOS设置图片背景

在UIViewController里面这样设置: self.view.backgroundColor = [UIColor colorWithPatternImage: [UIImage imageNamed:@"1.jpg"] ];

Java开发桌面程序学习(七)——ImageView设置图片以及jar包读取fxml文件

ImageView设置图片 JavaFx的ImageView,设置图片不能直接通过属性设置,只能通过代码来设置 ImageView设置图片 首先,我们让fxml对应的那个controller的java文件实现Initializable接口,之后就在复写的该接口的initialize方法中设置我们ImageView的图片 我的图片是放在了一个img文件夹里 之后,和之前的fxml一样,得去修改pom.xml,不然maven就会把img这个文件夹的内容全部忽略掉,之后就会找不到图片文件 @Overr

设置二维码图片背景透明教程

继之前的博客:PDF文件添加二维码水印教程.图片添加二维码水印教程之后,对之前的添加二维码水印功能进行完善,之前的程序生成的二维码图片背景不是透明的,所以不是很美观,所以本博客对程序进行完善,对二维码图片设置背景为透明的,不过这样美观了,但是很有可能出现遮住pdf文字或者图片的情况,这种情况会导致二维码不能扫描 参考网上教程,封装个方法调用 /** * 设置图片背景透明 * @date 2019年6月27日下午8:46:42 * @param srcImage * @param alpha *

动态设置图片的宽度和高度

动态设置图片控件的宽度和高度: imageView.getLayoutParams().width=600;imageView.getLayoutParams().height=400; 设置图片(src): imageView.setImageResource(resId); android获得屏幕高度和宽度: 1.WindowManager wm = (WindowManager) getContext()                     .getSystemService(Cont

ImageView设置点击效果没有用?ImageView src的图片大小改变不了?

ImageView设置点击效果没有用? 解决 1.ImageView xml里面必须clickable 和longClickable为true <ImageView android:layout_width="@dimen/x90" android:layout_height="@dimen/x90" android:padding="@dimen/x26" android:layout_gravity="right|center

Windows7只能设置纯色背景解决方法

解决设置设置纯色图片,不能设置其他背景图片的方法. 比如这样的. 首先找到这个目录 C:\Users\(这个位置填写你的电脑用户名)\AppData\Roaming\Microsoft\Windows\Themes,(Users也有可能是中文名——用户) 把他删除,如果删除成功则就OK了,重新设置一些背景图片即可. 如果没有成功,提示文件正在打开,无法进行操作,则需要以下操作. 进入个性化页面,切换主题为windows经典 切换之后,即可删除 Themes文件夹. 原文地址:https://ww

QT模态对话框用法(在UI文件中设置Widget背景图,这个图是一个带阴影边框的图片——酷)

QT弹出模态对话框做法: 1.新建UI文件时,一定要选择基类是QDialog的,我的选择是:Dialog without Buttons(),如下图: 2.然后在使用的时候: MyDialog dlg(this); dlg.exec(); 如果不加this,则会在任务管理器里面产生一个新的EXE. 3.如果对话框的标题是自定义,不想使用系统的标题,这时候需要在代码中加入: setWindowFlags(Qt::Dialog | Qt::FramelessWindowHint ); setAttr