2012-11-04 34 views
7

Tôi đang tạo một ứng dụng phác họa, chủ yếu là để giải trí. Nhưng tôi đã gặp rắc rối.Android deallocate Bitmaps đi vào bộ nhớ "không xác định"

Trong ứng dụng của tôi, người dùng có thể "lật" qua các bản phác thảo mà họ đã vẽ. Những bản phác thảo này chỉ là 400x800 Bitmap. Nhưng tôi liên tục chạy ra khỏi lỗi bộ nhớ.

Bản họa được lưu vào SD ngay sau khi sử dụng flips xa họ, và sau đó chúng được deallocated với ...

if(bitmap != null) 
{ 
bitmap.recycle(); 
bitmap = null; 
} 

Vì vậy, chỉ có một hoặc hai file ảnh nên được nạp vào bộ nhớ tại bất kỳ trao thời gian, trước khi chúng được lưu và deallocated. Và với một vài bản in gỡ lỗi, tôi đã xác định rằng điều này là đúng (tối đa hai bitmap trong bộ nhớ cùng một lúc). Vấn đề của tôi là sau 14 tải/deallocations, chương trình bị treo với một OutOfMemoryError. Luôn luôn 14, không có vấn đề bao lâu tôi chờ đợi giữa "flips".

Tôi đã thử mở DDMS để xem phân bổ bộ nhớ của thiết bị là như thế nào. Kỳ lạ thay, mỗi khi một hình ảnh được deallocated, bộ nhớ đi đến phần "không rõ", thay vì phần "miễn phí". Điều này tiếp tục cho đến khi chỉ có một mảnh bộ nhớ "miễn phí" còn lại, tại thời điểm xảy ra sự cố (và bộ nhớ "không xác định" chuyển sang "miễn phí").

Sau nhiều lần googling, tôi đã tìm thấy một số tài nguyên cho biết bitmap phải là deallocated as expected và rằng Dalvik garbage collections always occur before an out of memory error. Và một vài trang linh tinh gợi ý rằng TẤT CẢ bộ nhớ được sử dụng bởi một Bitmap được phân phối theo GC (bản gốc và JVM heap)

Tôi nên lưu ý, tại thời điểm này, tôi đang thử nghiệm trên hai điện thoại khác nhau. Motorola Droid X (hình ảnh chứng khoán, Android 2.3.3) và Samsung Galaxy S3 (CyanogenMod 9, Android 4.0.4). Cả hai đều thể hiện hành vi giống hệt nhau. Các công cụ Android của tôi được cập nhật với tất cả các phiên bản SDK và tôi đã kiểm tra hàng triệu lần để đảm bảo rằng không có gì khác trong mã của tôi đang thực hiện bất kỳ phân bổ lạ nào (thực tế không có gì được phân bổ sau khi khởi động chương trình).

Vì vậy,, tôi nên xử lý đúng cách một Bitmap sao cho nó được giải phóng (không chỉ là "không xác định") và tôi có thể sử dụng bộ nhớ ở nơi khác? Là một loại câu hỏi bổ sung, hồ bơi bộ nhớ "không xác định" này là gì và nó là gì?

EDIT: Ngữ pháp và chính tả, đã thêm một số ghi chú trên nền tảng.

+1

Tôi đã cố gắng tái tạo sự cố của bạn nhưng không may mắn - Tôi không thể thấy bất kỳ bộ nhớ "không xác định" nào trong DDMS. Bạn đang đề cập đến hàng "đối tượng không xác định" được hiển thị trong bảng thống kê, btw? Bạn có nhớ hiển thị mã bạn sử dụng để tạo các thể hiện 'Bitmap' không? –

+0

Làm thế nào để bạn vẽ Bitmap của bạn? Nó được gắn vào một ImageView thông qua setImageBitmap? – Freddroid

+0

Sau khi người dùng lật, điều gì sẽ xảy ra với lần xem hình ảnh đã giữ nó? –

Trả lời

0

Sử dụng hình ảnh lớn (cũng gần 1mb). Bạn có thể sử dụng androidmanifest trong thẻ ứng dụng đặt true heap và sử dụng chế độ xem tùy chỉnh không sử dụng imageview (vì quá phức tạp và cần nhiều hơn các chế độ xem khác)

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