2013-02-11 11 views
5

Meine Anwendung abstürzt, dies in logcat zeigt:java.lang.OutOfMemoryError Auch in einem try-catch-Block?

java.lang.OutOfMemoryError: (Heap Size=39047KB, Allocated=19932KB) 
     at android.graphics.BitmapFactory.nativeDecodeFile(Native Method) 
     at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:373) 
     at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:443) 
     at com.mApp.mobileapp.mActivity.onActivityResult(mActivity.java:196) 
     at android.support.v4.app.FragmentActivity.onActivityResult(FragmentActivity.java:153) 
     at android.app.Activity.dispatchActivityResult(Activity.java:4752) 
     at android.app.ActivityThread.deliverResults(ActivityThread.java:3449) 
     at android.app.ActivityThread.handleSendResult(ActivityThread.java:3503) 
     at android.app.ActivityThread.access$1100(ActivityThread.java:144) 
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1320) 
     at android.os.Handler.dispatchMessage(Handler.java:99) 
     at android.os.Looper.loop(Looper.java:156) 
     at android.app.ActivityThread.main(ActivityThread.java:5109) 
     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:991) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:758) 
     at dalvik.system.NativeStart.main(Native Method) 

Während dieser Code ausgeführt wird:

String selectedImagePath = data.getStringExtra("imageByteCode"); 
try { 
    File imageFile = new File(selectedImagePath); 
    Bitmap bitmap = BitmapFactory.decodeFile(imageFile 
     .getAbsolutePath());//line 196 
    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos); 
    base64code = selectedImagePath; 
    mImage.setImageBitmap(bitmap); 
    } catch (Exception e) { 
    } 

Da ich es war ansteckend, ich erwartet, dass es nie die App zum Absturz bringen. selectedImagePath ist der Pfad des ausgewählten Bildes auf der SD-Karte, die nie 3m.b aber Heap Size = 39047KB, Allocated = 19932KB ??

Danke

Antwort

4

Sie nicht ihn fangen haben. OutOfMemoryError ist abgeleitet von Error, nicht von Exception. Es ist ein Error, weil normalerweise eine Anwendung es nicht fangen soll, es gibt fast nichts, das Ihre Anwendung wiederherstellen kann.

+0

groß. Aber keines der Bilder ist mehr als 3 MB groß, also kann ich die Bitmap-Speicherzuweisung nicht richtig handhaben? –

+0

Zum Laden großer Bilder kann dies hilfreich sein: http://stackoverflow.com/questions/2798756/load-large-images-into-bitmap – Henry

7

Platz android:largeHeap="true" in Ihrer Manifest-Datei unter der Anwendung Tag.

Die largeHeap weist die VM an, Ihnen mehr RAM zu geben, damit Sie große Bitmaps und Strings verwalten können. LargeHeap funktioniert in api 12+.

Und wenn Sie den Fehler mit try/catch-Block fangen wollen, müssen Sie

try 
     { 

     }catch (OutOfMemoryError e) { 
      // TODO: handle exception 
     } 

verwenden Wenn Sie dies erleben, während das Projekt im Android Studio Gebäude

Error:Uncaught translation error: java.util.concurrent.ExecutionException: java.lang.OutOfMemoryError: GC overhead limit exceeded 

fügen in Ihrer build.gradle Datei

dexOptions { 
    javaMaxHeapSize "4g" 
} 
+1

Epische Antwort. Viele Informationen in so wenigen Worten wie möglich. +1 großer Haufen. +1 OutOfMemoryError kann (manchmal) wiederhergestellt werden und das ist der Code, um es zu tun. In dieser Situation versuchte der Fragesteller, ein Bild zu öffnen. Mit 'try catch (OutOfMemoryError)' stürzt die App nicht ab und dem Benutzer kann eine Fehlermeldung angezeigt werden. – Andy

+0

@Andy Ich bin froh, dass ich geholfen habe. – Naskov

+0

Ich brauche immer noch eine bessere Bild-Caching-Bibliothek, aber das gibt mir ein wenig Spielraum! Danke (von loopj zu Universal Image Loader) – Andy

Verwandte Themen