疑难杂症之----------setContentView()报java.lang.OutOfMemoryError错误

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/dfskhgalshgkajghljgh/article/details/53673277

1. 前言

app用户量一大,经常遇到如下问题,今天刷崩溃日志,又看到这个错误:调用setContentView方法,解析xml布局文件时,内存溢出,java.lang.OutOfMemoryError。

java.lang.OutOfMemoryError
    at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
    at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:597)
    at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:432)
    at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:840)
    at android.content.res.Resources.createFromResourceStream(Resources.java:2477)
    at android.content.res.Resources.loadDrawable(Resources.java:2136)
    at android.content.res.Resources.getDrawable(Resources.java:710)
    at android.graphics.drawable.StateListDrawable.inflate(StateListDrawable.java:176)
    at android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:937)
    at android.graphics.drawable.Drawable.createFromXml(Drawable.java:877)
    at android.content.res.Resources.loadDrawable(Resources.java:2116)
    at android.content.res.Resources.getDrawable(Resources.java:710)
    at com.android.internal.policy.impl.PhoneWindow.generateLayout(PhoneWindow.java:3042)
    at com.android.internal.policy.impl.PhoneWindow.installDecor(PhoneWindow.java:3085)
    at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:286)
    at android.app.Activity.setContentView(Activity.java:1946)
    at com.centercloud.dl.dynamicload.CentercloudDLBaseActivity.setContentView(Proguard:261)
    at com.centercloud.mobile.DetailActivity.onCreate(DetailActivity.java:187)
    at com.centercloud.dl.dynamicload.internal.DLProxyImpl.launchTargetActivity(Proguard:172)
    at com.centercloud.dl.dynamicload.internal.DLProxyImpl.onCreate(Proguard:135)
    at com.centercloud.dl.dynamicload.CentercloudDLProxyActivity.onCreate(Proguard:82)
    at android.app.Activity.performCreate(Activity.java:5248)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2162)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2247)
    at android.app.ActivityThread.access$800(ActivityThread.java:141)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1210)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:136)
    at android.app.ActivityThread.main(ActivityThread.java:5111)

2.解决思路及方法

一 . 应急方法
很多人为了不出现crash,又暂时找不到解决方法,于是写了如下的代码(不推荐)

try{
        setContentView(R.layout.activity_main);
    }catch (OutOfMemoryError e) {
        e.printStackTrace();
    }

二. 正确方法
1)图片角度
使用更小尺寸或者更低像素的图片,比如使用.jpg格式的图片,因为png格式的图片会占据比.jpg图片更大的内存空间;对图片进行压缩。—–可能设计师不会接受低分辨率的图片,但是你必须考虑内存容量。

2)优化xml布局
1.从布局中删除图片,但保留ImageView元素(如果有)。 如果是背景,删除背景。 然后使用java代码来有效地加载图像。因为使用java代码我们可以优化图片资源再使用。
2.使用延时加载技术,如果你的界面并不是需要你一次性全部显示,可以优先加载先使用的布局,等需要的时候再显示剩余的布局(viewstub),或者使用listview(本身带有延时加载)

3)增加你的应用程序的“heapSize”
1.在Android API 11 以上的机型中使用androiod:largeHeap=”true”属性来为App申请更大堆内存。
2.通过NDK进行内存密集型任务,因为NDK不像SDK那样强加内存限制。

4)其他界面带来的内存泄漏
借助mat工具定位是否是其他界面带来的内存泄漏。
分析方法如下:http://blog.csdn.net/dfskhgalshgkajghljgh/article/details/50513985

参考文章:
http://stackoverflow.com/questions/11275650/how-to-increase-heap-size-of-an-android-application
http://stackoverflow.com/questions/27916019/java-lang-outofmemoryerror-android-graphics-bitmapfactory-nativedecodeassetnati

猜你喜欢

转载自blog.csdn.net/dfskhgalshgkajghljgh/article/details/53673277
今日推荐