2011-11-02 32 views
20

Ứng dụng của tôi có thể tải các hình ảnh khá lớn. Trong một nỗ lực để được nhớ bảo thủ, tôi đang cố gắng sử dụng một bitmap tạm thời để nạp và một cho hình ảnh cuối cùng sau khi chuyển đổi:Android: lỗi "cố gắng sử dụng bitmap tái chế" với các bitmap tạm thời

..... 
finalBitmap.recycle(); 
finalBitmap = null; 
Bitmap tempBitmap = BitmapFactory.decodeStream(fin, ...); 
finalBitmap = Bitmap.createBitmap(tempBitmap, ....); 
imgview.setImageBitmap(finalBitmap); 
..... 

Bây giờ, vào thời điểm này, chúng tôi đang thực hiện với tempBitmap, đó là chỉ cần vận chuyển Bitmap đã giải mã tới bước chuyển đổi trong createBitmap. Vì vậy:

..... 
tempBitmap.recycle(); 
tempBitmap = null; 
..... 

Và ... nó đổ vỡ với lỗi "cố gắng sử dụng bitmap tái chế" đặc biệt do tái chế tempBitmap. tempBitmap không được hiển thị và chỉ được sử dụng ngay tại đó.

Có gì xảy ra ở đây? nên tôi chỉ sử dụng "finalBitmap" suốt và dựa vào createBitmap để quản lý nó (finalBitmap = Bitmap.createBitmap (finalBitmap, ....))? Tôi không nhìn thấy những gì phụ thuộc liên tục trên tempBitmap có thể sẽ gây ra một thất bại như vậy.

Edit: Vâng, sự phân rỗng dường như dẫn đến việc, cuối cùng thu gom rác thải phù hợp, nhưng tôi hoang mang vì sao rác() trên một Bitmap temp là rất khó giải quyết trong trường hợp này. Tôi nhận được ấn tượng rằng createBitmap() đang giữ một tham chiếu đến nó nhưng tại sao, và trong bao lâu?

Trả lời

25

Trực tiếp từ Android documentation:

Trả về một bitmap bất biến từ nhóm quy định của nguồn bitmap. Bitmap mới có thể là đối tượng giống như nguồn, hoặc một bản sao có thể đã được thực hiện.

Dường như các hàm createBitmap có khả năng tái sử dụng bitmap mà bạn đã cung cấp. Nếu đúng như vậy, bạn không nên tái chế bitmap tạm thời vì bitmap cuối cùng của bạn đang sử dụng nó. Một điều bạn có thể làm là

if(tempBitmap != finalBitmap) { 
    tempBitmap.recycle(); 
} 

Điều đó chỉ nên tái chế tempBitmap khi nó không giống như finalBitmap. Ít nhất đó dường như là những gì tài liệu ngụ ý.

+1

Tôi đã bỏ lỡ một chút về nó có khả năng là cùng một đối tượng. Thiết lập temp của tôi thành null không gây ra tác dụng phụ bởi vì nó không thực sự giải phóng đối tượng, trong khi tái chế() trực tiếp ảnh hưởng đến nó. Hmm. Tôi chấp nhận câu trả lời của bạn và hy vọng bạn sẽ làm cho tôi ủng hộ của upvoting câu hỏi của tôi (vì tôi nghĩ rằng đó là một chút hữu ích của thông tin cho người dân). – MartyMacGyver

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