项目中为解决Android out of memeory问题做出的尝试
来源:互联网 发布:证件照自拍软件 编辑:程序博客网 时间:2024/05/22 03:51
在项目中要使用几十张图片,以及背景,产生了out of memory异常.
Bitmap bitmap = Bitmap.createBitmap(BitmapFactory.decodeResource(getResources(), gi.getBitMapResoureceId(), mOptions));
因为大量使用图片而且切换屏幕时或回到前台时重复生成Bitmap ,导致内存溢出。
专门针对out of memory进行了调查。
问题点:
a.使用大量图片,耗用内存和cup
b.横竖屏切换或者activity回到前台时重复的调用了一些代码,例如读取数据库,重复生成一些对象
c.由于组件的背景图片多,在频繁横竖屏切换时重新加载xml会一时间占用大量内存
方法:
1.提取重复性的代码,就是能一次在onCreate()中做好的东西,不要再onResume()和onConfigurationChanged()中重复出现,这个要考虑业务和逻辑的东西。
但是组件和Layout还是要在onConfigurationChanged()重新加载的(我们使用了android:configChanges="touchscreen|keyboardHidden|orientation",所以横竖屏切换时只调用onConfigurationChanged()方法)。
2.将app的背景图片和button的背景及src从xml中提取出来,在代码中设置为成员变量,一次性读入不再重复读取
例如:
xml中:
android:background="@drawable/bg"
android:src="@drawable/water"
Java代码中:
private Drawable mBgDrawable = getResources().getDrawable(R.drawable.bg);
private Drawable mWaterDrawable = getResources().getDrawable(R.drawable.waterbg);
RelativeLayout mMainLayout = (RelativeLayout) findViewById(R.id.main);
ImageButton mBtnWater = (ImageButton ) findViewById(R.id.waterbyn);
mMainLayout.setBackgroundDrawable(mBgDrawable );
mBtnWater .setImageDrawable(mWaterDrawable );
ImageButton 设置时也可以是setBackgroundDrawable那这样就和xml中的background一个效果了。
后来又把这些成员变量做出static的,是为了提高效率。
但后来发现了问题。就是网上很多的关于Drawable会使用setCallback保留对组件(ImageButton )的引用,而组件又会保留对activity的引用,这样activity上的计数器不会0,虚拟机也不能回收已经不用的activity对象,再次引发内存溢出。
setBackgroundDrawable:
这里面的d.setCallback(this)可能会导致保留对组件的引用。当重新调用setBackgroundDrawable时,Drawable调用mBGDrawable.setCallback(null)先将原来的引用设置为null。
回到我的项目,我们在切换横竖屏时并没有重新生成activity,也没有需要销毁的activity,而且最初我们没有设置为static,那么这些成员变量的生命周期和activity是相同的,不会引发上述问题。(理论推测)我们目前的做法是在onConfigurationChanged()中增加了这么句话:
mWaterDrawable .setCallback(null)做个双保险。
那当将Drawable的变量设置为static后,应该在onDestroy中也调用mWaterDrawable .setCallback(null),保证activity可以被正常回收。
继续跟进中……
- 项目中为解决Android out of memeory问题做出的尝试
- Cassandra因为OOM(Out Of Memeory)被kernel直接kill掉的问题
- 解决TortoiseSVN中out of date问题的一个方法
- j2me 使用ant编译 出现out of memeory错误
- ORA-27102:out of memeory 故障处理一例
- 解决Out of memory问题
- 解决allegro 中OUT OF DATE SHAPES问题
- 解决allegro 中OUT OF DATE SHAPES问题
- 【Android】如何解决bitmap 内存溢出out of memory的问题
- Android有效解决加载大图片时内存溢出的问题 Out of memory
- android camera out of memory安卓照相机OOM问题的解决
- 解决 SVN提交 中out of date问题的一个办法
- 解决eclipse总提示out of build path的问题
- 终于解决了IE里的Out of memory问题!
- 使用matlab时出现Out of memory问题的解决
- 解决项目中无缘无故多出xxxxx.out.xml问题
- android加载图片Out Of Memory的解决
- android项目导入到eclipse中去出现 Case Variant exsits问题的部分解决方法尝试
- 基础函数的实现(strcpy,strcat, strcmp, atoi, itoa)
- Stl中使类成员函数成为谓词,mem_fun 和mem_fun_ref的使用
- 简单的Java对象(Plain Ordinary Java Objects)
- 2010年第十届高性能计算培训报名通知(第一轮)
- Linux中的叹号命令
- 项目中为解决Android out of memeory问题做出的尝试
- 数学库中应用SSE之一
- javascript的研究
- HTTP协议中POST、GET、HEAD等参数详解
- 数学库之二中应用:SSE/SSE2
- TraceView + 避免内存泄露, 有效利用内存
- Java中的transient,volatile和strictfp关键字
- Photoshop考核办法
- 管理者or下属的下属:中层角色如何定位?