美文网首页性能功耗
Android内存溢出

Android内存溢出

作者: 京写 | 来源:发表于2020-08-11 09:17 被阅读0次

如何避免OOM

1. 图片过大导致OOM(解决方法)

方法1: 等比例缩小图片
方法2:对图片采用软引用,及时地进行recyle()操作
方法3:使用加载图片框架处理图片,如专业处理加载图片的ImageLoader图片加载框架。还有XUtils的BitMapUtils来做处理
android图片压缩方法

2. 横竖屏切换导致OOM

一般情况下,开发中都会禁止横屏的。因为如果是来回切换话,activity 的生命周期会重新销毁
然后创建。
有时候我们会发现这样的问题,横竖屏切换N次后 OOM了。

解决办法:

没有配置前切换时方法:
onpause-onSaveInstanceState-onStop-onDestroy-onCreate-onStart-onRestoreInstanceState-onResume
系统会当做意外销毁,会触发onSaveInstenceState和onRestoreInstoreInstanceState方法。

在manifest中配置:针对Android 3.2 (API 级别 13)以后版本android:configChanges="orientation|screenSize|keyboardHidden"

在Activity中重写相关办法查看
public void onConfigurationChanged(Configuration newConfig) {  
    // TODO Auto-generated method stub  
    super.onConfigurationChanged(newConfig);  
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {  
        Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show();  
    } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {  
        Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();  
    }  
}  

打印log查看,会发现配置这个后,横竖屏后不会再引起生命周期方法重新销毁和加载,只会走onConfigurationChanged这个方法

针对Android 3.2 (API 级别 13)以以前版本
  • 不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次。
  • 设置Activity的android:configChanges="orientation"时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次。
  • 设置Activity的android:configChanges="orientation|keyboardHidden"时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法。
    **注意:和13版本以后不同,这个配置没有screenSize这个属性。
  1. 看看页面布局当中有没有大的图片,比如背景图之类的。
    去除xml中相关设置,改在程序中设置背景图(放在onCreate()方法中):
Drawable drawable = getResources().getDrawable(R.drawable.id);   
 ImageView imageView = new ImageView(this);    
imageView.setBackgroundDrawable(drawable);

在Activity destory 时注意,drawable.setCallback(null); 防止Activity得不到及时的释放

  1. 或者可以直接把 xml 配置文件加载成 view 再放到一个容器里,然后直接调用 this.setContentView(View view)方法,避免xml的重复加载。

  2. 在页面切换时尽可能少地重复使用一些代码
    比如:重复调用数据库,反复使用某些对象等等……

3. 查询数据库中有没有关闭游标 cursor.close

程序中经常会进行查询数据库的操作,如利用一个号码归属地查询的小demo , 但是经常会有使用完毕Cursor后没有关闭的情况。

如果我们的查询结果集比较小,对内存的消耗不容易被发现,只有在常时间大量操作的情况下才会出现内存问题,这样就会给以后的测试和问题排查带来困难和风险。

4. 构造Adapter时,没有使用缓存的 convertView

在使用ListView的时候通常会使用Adapter,那么我们应该尽可能的使用ConvertView。

为什么要使用convertView?

当convertView为空时,用setTag()方法为每个View绑定一个存放控件的ViewHolder对象。当convertView 不为空,重复利用已经创建的 view 的时候,使用 getTag()方法获取绑定的ViewHolder对象,这样就避免了findViewById对控件的层层查询,而是快速定位到控件。

5. Bitmap对象不再使用时调用recycle()释放内存

有时我们会手工的操作Bitmap对象,如果一个Bitmap对象比较占内存,当它不再被使用的时候,可以调用Bitmap.recycle()方法回收此对象的像素所占用的内存,但这不是必须的,视情况而定。

6. 其他

Android 应用程序中最典型的需要注意释放资源的情况是在 Activity 的生命周期中,在onPause()、onStop()、 onDestroy()方法中需要适当的释放资源的情况。使用广播没有注销也会产生OOM。

相关文章

  • Android 优化

    Android 内存优化内存溢出 , 内存泄漏 , 内存泄漏过多就导致内存溢出 Android 系统垃圾回收机制内...

  • 面试总结 | 记一次Android 面试

    Android中的内存泄漏和内存溢出有什么区别?内存溢出是指程序在申请内存的时候,没有足够的内存可以分配,导致Ou...

  • 面试经历:记一次Android面试

    Android中的内存泄漏和内存溢出有什么区别? 内存溢出是指程序在申请内存的时候,没有足够的内存可以分配,导致O...

  • Android内存溢出

    如何避免OOM 1. 图片过大导致OOM(解决方法) 方法1: 等比例缩小图片方法2:对图片采用软引用,及时地进行...

  • Android 非静态内部类/匿名类/Handler引起的内存泄

    一、内存溢出和内存泄漏 内存溢出:Android系统会给每个安卓程序分配一定的内存,当程序所使用的内存超过最大值就...

  • 艺术开发探索十五章笔记

    Android性能优化 Android不可能无限制的使用内存和CPU资源,过多的使用内存会导致内存溢出,即OOM。...

  • Android面试题整理

    Android方面: 1、View事件分发机制 2、资源加载原理 3、内存优化(内存泄漏、内存溢出),如何查找内存...

  • Android内存如何泄露

    Android内存如何泄露 对象的生命周期溢出 对象无限创建引起内存爆满 生命周期溢出 内存泄露说到底是,对象的生...

  • Caused by: java.lang.OutOfMemory

    最笨拙的方法:解决Android[http://lib.csdn.net/base/android] 内存溢出 其...

  • leakcanery2源码

    LeakCanary是Android上用于检查内存泄漏的工具,LeakCanary大大减少因内存泄漏导致的内存溢出...

网友评论

    本文标题:Android内存溢出

    本文链接:https://www.haomeiwen.com/subject/lsgzrktx.html