我有3個acitivtys Android應用:內存不足錯誤而加載的位圖
A1 - 開始 - > A2 - 開始 - > A3 - 當完成了他的過程:開始 - > A1
(所以我不 「完成();」 一個應用程序,我開始下activitys 「startActivity(..);」 用戶交互後的全部時間)
所以這三項活動有一個循環。 在每一個活動,我顯示3-9的照片,位於SD卡上,我與我的下面的函數加載:
try
{
Uri selectedImageURI = Uri.parse(strImagePath);
File imgFile = new File(getRealPathFromURI(selectedImageURI, c));
Bitmap myBitmap = BitmapFactory.decodeFile(imgFile.getAbsolutePath());
ivTmp.setImageBitmap(myBitmap);
}catch (Exception e)
{
return null;
}
這一切工作。 但有時(通過我的activitys循環幾次之後),我的應用程序崩潰..
logcat的告訴我:
01-16 13:42:15.863: DEBUG/dalvikvm(23161): GC_BEFORE_OOM freed 10K, 9% free 59019K/64400K, paused 29ms, total 30ms
01-16 13:42:15.863: ERROR/dalvikvm-heap(23161): Out of memory on a 8018704-byte allocation.
01-16 13:42:15.863: ERROR/AndroidRuntime(23161): FATAL EXCEPTION: main
java.lang.OutOfMemoryError
at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:502)
at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:355)
at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:785)
at android.content.res.Resources.loadDrawable(Resources.java:1965)
at android.content.res.Resources.getDrawable(Resources.java:660)
at android.widget.ImageView.resolveUri(ImageView.java:616)
at android.widget.ImageView.setImageResource(ImageView.java:349)
at <MyApp>.MyActivity$6.run(MyActivity.java:143)
at android.os.Handler.handleCallback(Handler.java:725)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5039)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
at dalvik.system.NativeStart.main(Native Method)
有人可以給我一些提示如何處理崩潰? 也許是因爲我的活動設置爲狀態「已暫停」而不是正確關閉它們?
嘗試調用OnPause()中的位圖.recycle()。並在onResume()而不是onCreate()中加載它們。 – pumpkee
是否有可能以更好的方式做到這一點?比如,如果我的所有位圖都位於線性佈局中,那麼調用llMain.recycle()或類似的東西? – Prexx
您可以創建一個ArrayList,向其中添加您加載的每個位圖並循環遍歷該位圖。另一個一般的事情:玩圖像的樣本大小。不知道你的應用程序是什麼,但只是在大多數時候在屏幕上顯示位圖,仍然可以對它們進行採樣並節省內存。請參閱:http://developer.android.com/training/displaying-bitmaps/load-bitmap.html –
pumpkee