美文网首页
如何避免 OOM 异常

如何避免 OOM 异常

作者: HEXG_ | 来源:发表于2017-09-29 10:03 被阅读0次

    链接:http://blog.csdn.net/u010375364/article/details/51932688

    想要避免 OOM 异常首先我们要知道什么情况下会导致 OOM 异常。

    1、图片过大导致 OOM

    Android 中用 bitmap 时很容易内存溢出,比如报如下错误:Java.lang.OutOfMemoryError : bitmap size

    exceeds VM budget。

    解决方法:

    方法 1: 等比例缩小图片

            BitmapFactory.Options options =newBitmapFactory.Options();

            options.inSampleSize = 2;

             //Options只保存图片尺寸大小,不保存图片到内存

             BitmapFactory.Optionsopts=newBitmapFactory.Options();

             opts.inSampleSize = 2;

             Bitmap bmp =null;

             bmp = BitmapFactory.decodeResource(getResources(), mImageIds[position],opts);

             //回收

             bmp.recycle();//

    以上代码可以优化内存溢出,但它只是改变图片大小,并不能彻底解决内存溢出。

    方法 2:对图片采用软引用,及时地进行 recyle()操作

              SoftReferencebitmap=newSoftReference(pBitmap);

              if(bitmap !=null){

                      if(bitmap.get() !=null&& !bitmap.get().isRecycled()){

                            bitmap.get().recycle();

                            bitmap =null;

                      }

            }

    2、界面切换导致 OOM

    有时候我们会发现这样的问题,横竖屏切换 N 次后 OOM 了。

    这种问题没有固定的解决方法,但是我们可以从以下几个方面下手分析。

    1)、看看页面布局当中有没有大的图片,比如背景图之类的。

    去除 xml 中相关设置,改在程序中设置背景图(放在 onCreate()方法中):

              Drawable drawable = getResources().getDrawable(R.drawable.id);

              ImageView imageView =newImageView(this);

              imageView.setBackgroundDrawable(drawable);

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

    2)、 跟 上 面 方 法 相 似 , 直 接 把 xml 配 置 文 件 加 载 成 view 再 放 到 一 个 容 器 里 , 然 后 直 接 调 用

    this.setContentView(View view);方法,避免 xml 的重复加载。

    3)、 在页面切换时尽可能少地重复使用一些代码

    比如:重复调用数据库,反复使用某些对象等等......

    常见的内存使用不当的情况

    3、查询数据库没有关闭游标

    程序中经常会进行查询数据库的操作,但是经常会有使用完毕 Cursor 后没有关闭的情况。如果我们的查询结果集比较小,对内存的消耗不容易被发现,只有在常时间大量操作的情况下才会出现内存问题,这样就会给以后的测试和问题排查带来困难和风险。

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

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

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

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

    6、其他

    Android 应用程序中最典型的需要注意释放资源的情况是在 Activity 的生命周期中,在 onPause()、onStop()、onDestroy()方法中需要适当的释放资源的情况。

    相关文章

      网友评论

          本文标题:如何避免 OOM 异常

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