所以我有一個臭名昭着的OOM錯誤引起的大位圖。但我已經設法解決大部分問題。當我點擊後關閉應用程序,然後立即啓動應用程序時,剩下的唯一問題就發生了。然後,該應用程序將崩潰給我一個OOM(內存不足)錯誤。如果我點擊回家,這不會發生。安卓應用崩潰內存重啓
這是怎麼發生的?我的猜測是,GC還沒有完成清理工作,現在我開始啓動它,而舊數據仍然處於周圍。當然這不是一個新的應用程序,所以舊版本和新版本都會受到相同的應用程序內存限制。
在這個問題上的任何投入和可能的解決方案將是偉大的。
什麼,我tryed:
位圖的所有下載我用:
BitmapFactory.Options op = new Options();
op.inPurgeable = true;
bmImg = BitmapFactory.decodeStream(is,null,op);
使圖像尺寸更小寬x高(以KB大小大致相同) 。 < - 這解決了問題,所以我有一個後備的解決方案,除非有一個人在那裏有一個超級的解決方案:)
錯誤日誌的摘錄:
06-25 04:29:28.917: E/AndroidRuntime(8819): Caused by: java.lang.OutOfMemoryError: bitmap size exceeds VM budget
06-25 04:29:28.917: E/AndroidRuntime(8819): at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
06-25 04:29:28.917: E/AndroidRuntime(8819): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:460)
06-25 04:29:28.917: E/AndroidRuntime(8819): at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:336)
06-25 04:29:28.917: E/AndroidRuntime(8819): at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:715)
06-25 04:29:28.917: E/AndroidRuntime(8819): at android.content.res.Resources.loadDrawable(Resources.java:1713)
06-25 04:29:28.917: E/AndroidRuntime(8819): at android.content.res.TypedArray.getDrawable(TypedArray.java:601)
06-25 04:29:28.917: E/AndroidRuntime(8819): at android.widget.ImageView.<init>(ImageView.java:122)
06-25 04:29:28.917: E/AndroidRuntime(8819): at android.widget.ImageView.<init>(ImageView.java:112)
06-25 04:29:28.917: E/AndroidRuntime(8819): ... 23 more
編輯: 於是兩個事情爲我解決這個問題。
- 清除我的數據庫,並將我的主要活動ondestroy()中的大圖像設置爲null。
- 使大圖像變小。
但是,這只是引發同樣的基本問題,如果調用onDestroy(),爲什麼我的活動沒有正確關閉,然後打開一個新的?此外,我看到我的活動在關閉後很長一段時間內繼續運行。這可能與問題有關嗎?我如何查明原因?
編輯2:culprint似乎是我的LruCache。我使用了ondestroy()中未清空的靜態lrucache。當應用程序重新啓動時,lrucache中的所有圖像仍然存在,這會導致問題。我仍然想知道爲什麼這只是在重新啓動時出現問題?當我在關閉它之前回到我的主要活動時,這不應該成爲一個問題嗎?
這可能是在位圖解碼的大文件大小,所以你可以嘗試這個帖子的位圖大尺寸文件解碼解決方案:http://stackoverflow.com/questions/477572/android-strange-out-of-memory-issue -while-loading-an-image-to-a-bitmap-object/823966#823966歡迎! – Dinesh