2013-02-11 16 views
5

tai nạn của tôi ứng dụng, hiển thị này trong logcat:java.lang.OutOfMemoryError Ngay cả trong một khối try-catch?

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) 

Trong khi chạy mã này:

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

Kể từ khi tôi đã bắt nó, tôi không bao giờ mong đợi nó sụp đổ các ứng dụng. selectedImagePath là đường dẫn của hình ảnh được chọn trên thẻ SD, không bao giờ vượt quá 3m.b nhưng Kích thước heap = 39047KB, Phân bổ = 19932KB ??

Cảm ơn bạn

Trả lời

4

Bạn không hiểu. OutOfMemoryError có nguồn gốc từ Error, không phải từ Exception. Nó là một Error vì thông thường một ứng dụng không phải là bắt giữ nó, gần như không có gì ứng dụng của bạn có thể làm để phục hồi.

+0

tuyệt vời. Nhưng không ai trong số các hình ảnh có kích thước hơn 3MB, do đó, tôi có thể không được xử lý phân bổ bộ nhớ bitmap đúng cách? –

+0

Để tải hình ảnh lớn, điều này có thể hữu ích: http://stackoverflow.com/questions/2798756/load-large-images-into-bitmap – Henry

7

Đặt android:largeHeap="true" vào tệp kê khai của bạn dưới ứng dụng thẻ.

largeHeap yêu cầu máy ảo cung cấp cho bạn nhiều RAM hơn để bạn có thể quản lý các bitmap và chuỗi lớn. LargeHeap hoạt động trong api 12+.

Và nếu bạn muốn bắt lỗi với khối try/catch bạn cần phải sử dụng

try 
     { 

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

Nếu bạn đang gặp này trong khi xây dựng dự án trong Android Studio

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

thêm vào của bạn build.gradle tệp

dexOptions { 
    javaMaxHeapSize "4g" 
} 
+1

Câu trả lời sử thi. Rất nhiều thông tin trong càng ít từ càng tốt. +1 lớn. +1 OutOfMemoryError có thể được phục hồi từ (đôi khi) và đây là mã để làm điều đó. Trong tình huống này, người hỏi đang cố gắng mở một hình ảnh. Sử dụng 'try catch (OutOfMemoryError)' điều này sẽ không làm hỏng ứng dụng và thông báo lỗi có thể được hiển thị cho người dùng. – Andy

+0

@Andy Tôi rất vui vì tôi đã giúp. – Naskov

+0

Tôi vẫn cần sử dụng thư viện lưu trữ hình ảnh tốt hơn, nhưng điều này mang lại cho tôi một số thời gian dài! cảm ơn (đi từ loopj đến Universal Image Loader) – Andy