Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

java.lang.OutOfMemoryError Even in a try-catch block?

My application crashes, showing this in logcat:

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)

While running this code:

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) {
    }

Since i was catching it, i never expected it to crash the app. selectedImagePath is the path of the selected image on the SD card, which never exceeds 3m.b but Heap Size=39047KB, Allocated=19932KB ??

Thank You

like image 365
Archie.bpgc Avatar asked Feb 11 '13 13:02

Archie.bpgc


2 Answers

Place android:largeHeap="true" in your Manifest file under the application tag.

The largeHeap tells the VM to give you more RAM so you can manage big bitmaps and Strings. LargeHeap works in api 12+.

And if you want to catch the error with try/catch block you need to use

try
        {

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

If you are experiencing this while building the project in Android Studio

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

add in your build.gradle file

dexOptions {
    javaMaxHeapSize "4g"
}
like image 58
Naskov Avatar answered Oct 21 '22 11:10

Naskov


You did not catch it. OutOfMemoryError is derived from Error, not from Exception. It is an Error because normally an application is not supposed to catch it, there is close to nothing your application can do to recover.

like image 8
Henry Avatar answered Oct 21 '22 11:10

Henry