2013-01-16 38 views
17

tôi có một ứng dụng Android với 3 acitivtys:Out of Memory Lỗi trong khi tải bitmap

A1 - bắt đầu -> A2 - bắt đầu -> A3 - khi hoàn tất quá trình của mình: bắt đầu -> A1

(vì vậy tôi làm không phải là "kết thúc();". ứng dụng tôi bắt đầu activitys tiếp theo với "startActivity (..);" trong suốt thời gian sau khi userinteraction)

nên có một vòng lặp trong 3 hoạt động này. Trên mỗi hoạt động, tôi hiển thị 3-9 hình ảnh, nằm trên thẻ SD, mà tôi tải với chức năng sau đây của tôi:

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; 
} 

này tất cả các công trình. Nhưng đôi khi (sau khi lặp một vài lần qua activitys của tôi), treo ứng dụng của tôi ..

Logcat nói với tôi:

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) 

Ai đó có thể đưa ra một số lời khuyên của tôi làm thế nào để xử lý các tai nạn? Có thể vì hoạt động của tôi được đặt thành trạng thái "bị tạm dừng" thay vì đóng chúng chính xác?

+1

thử gọi .recycle() trên bitmap của bạn trong OnPause(). và tải chúng trong onResume() không onCreate(). – pumpkee

+0

là nó có thể làm điều này một cách tốt hơn? giống như, nếu tất cả các bitmap của tôi nằm trong linearlayout, sau đó gọi llMain.recycle() hoặc một cái gì đó như thế? – Prexx

+0

Bạn có thể tạo một ArrayList mà bạn thêm mỗi bitmap mà bạn tải và tái chế lặp qua đó. Một điều chung khác: Chơi với kích thước mẫu của hình ảnh. Không biết ứng dụng của bạn là gì nhưng chỉ đơn giản là hiển thị bitmap trên màn hình hầu hết thời gian nó vẫn còn sufficiant để mẫu chúng xuống và tiết kiệm bộ nhớ. Xem: http://developer.android.com/training/displaying-bitmaps/load-bitmap.html – pumpkee

Trả lời

31

cho sửa chữa nhanh chóng bạn có thể thêm

android:largeHeap="true" trong thẻ ứng dụng biểu hiện của bạn

link here:

tôi phải đối mặt với vấn đề oom cho bàn của tôi trong kindle và nook

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

có đặc điểm kỹ thuật là đã đề cập để sử dụng heap lớn hơn link here:

chỉnh sửa: sử dụng Caching Bitmaps kỹ thuật link here

+1

tôi cũng thấy điều này trong một câu hỏi khác, sẽ không hoạt động. – Prexx

+1

Caching Bitmap giúp tôi rất nhiều! Cảm ơn! :) – Prexx

+1

Cảm ơn bạn. Đó android: bigHeap cờ trong biểu hiện giải quyết vấn đề cho tôi. –

0

Ừ android doesnt ngay lập tức phá hủy hoạt động khi họ không thể nhìn thấy cho người sử dụng, nhưng có một số phương pháp vòng đời được gọi là tùy thuộc vào tình trạng hiện thời. Kiểm tra http://developer.android.com/guide/components/activities.html#Lifecycle

Bạn có thể thử hoàn thành các hoạt động trong onStop() hoặc onDestroy() vì chúng sẽ được gọi khi hoạt động không hiển thị và khi hệ thống hoạt động chậm trên bộ nhớ tương ứng. :-)

+0

tôi đã cố gắng để hoàn thành các hoạt động, nhưng kết quả là, tôi đã trở lại một hoạt động .. ví dụ: im trên A3 và muốn đi đến A1: tôi gọi startIntent (A1) và kết thúc -> im trên A2 ..:/ – Prexx

+0

Ok , vì vậy tôi nghĩ nếu bạn ghi đè onStop() cho mỗi hoạt động và đặt kết thúc() trong phương thức đó sẽ kết thúc hoạt động đó và giải phóng tài nguyên thay vì hệ thống giữ nó trong bộ nhớ khi hoạt động tiếp theo đã bắt đầu. Hãy chắc chắn rằng kết thúc() isnt chấm dứt hoạt động hiện tại. – Broo

0

Điều này là do độ phân giải cao hình ảnh bạn phải mở rộng quy mô bitmap sử dụng đoạn mã sau

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

tôi đã có vấn đề tương tự khi hiển thị hình ảnh độ phân giải cao. Tôi đã tìm kiếm và áp dụng tất cả các giải pháp bitmap android được đưa ra trong http://developer.android.com/training/displaying-bitmaps/index.html và sau đây lưu trữ mekanism trong liên kết. nhưng không ai trong số họ làm việc. không phải bất kỳ giải pháp phù hợp nào. Sau đó, tôi đã phát hiện ra rằng vấn đề là: Tôi không thể sử dụng cấu trúc thư mục có thể vẽ được. Tôi đã giữ hình ảnh có độ phân giải cao trong các thư mục mdpi và hdpi. điều này gây ra quy mô android lên các hình ảnh với kích thước cực. Hình ảnh 100 kb đã khiến bộ nhớ tăng 20 mb nhờ phần màn hình/bộ nhớ android. vì vậy tôi đã thêm những hình ảnh siêu phân giải này vào thư mục xxhdpi, sau đó nó được FIXED đột ngột.sau đó thanh trượt hình ảnh của tôi hoạt động hoàn hảo

Các vấn đề liên quan