疑難雜症之----------setContentView()報java.lang.OutOfMemoryError錯誤

  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


如有錯誤歡迎指出來,一起學習。
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章