2013-01-16 41 views
17

我有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) 

有人可以給我一些提示如何處理崩潰? 也許是因爲我的活動設置爲狀態「已暫停」而不是正確關閉它們?

+1

嘗試調用OnPause()中的位圖.recycle()。並在onResume()而不是onCreate()中加載它們。 – pumpkee

+0

是否有可能以更好的方式做到這一點?比如,如果我的所有位圖都位於線性佈局中,那麼調用llMain.recycle()或類似的東西? – Prexx

+0

您可以創建一個ArrayList ,向其中添加您加載的每個位圖並循環遍歷該位圖。另一個一般的事情:玩圖像的樣本大小。不知道你的應用程序是什麼,但只是在大多數時候在屏幕上顯示位圖,仍然可以對它們進行採樣並節省內存。請參閱:http://developer.android.com/training/displaying-bitmaps/load-bitmap.html – pumpkee

回答

31

爲速戰速決,你可以在Kindle和角落在您的清單應用程序標記添加

android:largeHeap="true"

link here:

我面臨OOM問題對我的表

Heap size (large) 
android:largeHeap="true" 

有規範提到使用較大的堆link here:

編輯:使用位圖緩存技術link here

+1

我也在另一個問題看到這個,不會工作。 – Prexx

+1

緩存位圖幫助我很多!謝謝! :) – Prexx

+1

謝謝。清單中的android:largeHeap標誌爲我解決了這個問題。 –

0

呀安卓犯規立即銷燬時,他們沒有對用戶可見,但也有不少的情況是根據當前狀態調用生命週期方法的活動。檢出http://developer.android.com/guide/components/activities.html#Lifecycle

您可以嘗試完成onStop()或onDestroy()中的活動,因爲這些活動在活動不可見時以及系統內存分別在內存不足時調用。 :-)

+0

我試圖完成活動,但結果,我回去了一個活動..例如:即時在A3上,並想要去A1:我打電話給startIntent(A1),並完成 - >即時在A2 ..:/ – Prexx

+0

好吧,所以我認爲如果您爲每個活動重寫onStop(),並將finish()放在該方法內,那麼應該完成該活動並釋放資源,而不是在下一活動開始後將系統保存在內存中。確保finish()不會終止當前活動。 – Broo

0

這是由於高分辨率圖像,你必須縮放位圖使用下面的代碼

Bitmap myBitmap = BitmapFactory.decodeFile(imgFile.getAbsolutePath()); 

    int h = 100; // height in pixels 
    int w = 100; // width in pixels 
Bitmap photoBitMap = Bitmap.createScaledBitmap(myBitmap,h, w, true); 
ivTmp.setImageBitmap(photoBitMap); 
2

我有類似的問題,同時顯示高分辨率的圖像。我已經搜索並應用了所有在http://developer.android.com/training/displaying-bitmaps/index.html中給出的android位圖解決方案和下面的鏈接中的高速緩存mekanism。但他們都沒有工作。在任何地方都不是任然後我發現問題是:我無法正確使用可繪製的文件夾結構。我在mdpi和hdpi文件夾中保存高分辨率圖像。這導致android將圖像放大到超大尺寸。由於android監視器/內存部分,100 kb圖像導致內存增加20 mb。 所以我已經添加了這些超分辨率的圖像xxhdpi文件夾,然後將它突然不動。那麼我的圖像滑塊完美無缺地工作