9

Theo phát triển Android trang web, định nghĩa Bitmap.recycle() phương pháp là:Khi nào (nếu có), tôi có nên sử dụng Bitmap.recycle() không?

miễn phí đối tượng có nguồn gốc gắn liền với bitmap này, và xóa các tham chiếu đến dữ liệu pixel

tôi đã phát triển một số các ứng dụng tạo/giải mã rất nhiều ảnh bitmap và đặt đối tượng bitmap kết quả là ImageView s. Đôi khi tôi đã có những trường hợp ngoại lệ nổi tiếng như:

bitmap kích thước excceded ngân sách vm

ra lỗi bộ nhớ

Ngoài ra tôi chắc chắn Tôi không có bất kỳ rò rỉ bộ nhớ nào có thể gây ra điều đó.

Sau nhiều tìm kiếm, tôi phát hiện ra phương pháp "tái chế" và sử dụng nó để giải phóng bộ nhớ riêng của bitmap khi không còn cần thiết nữa. Dường như nó đã giúp rất nhiều.

Tôi hỏi nếu đó là điều tôi phải làm trong trường hợp này, bởi vì Tôi biết hệ thống đang thực hiện việc này mà không gọi nó rõ ràng (có phải không? Có thể tôi sai).

Tôi có nên sử dụng phương pháp này trong các tình huống như thế này không?

Trong trường hợp nào tôi nên sử dụng phương pháp này?

Tôi có nên sử dụng phương pháp này không?

cảm ơn trước.

UPDATE:

google posted this hướng dẫn thời gian gần đây, trong đó nói rằng:

Trên Android 2.3.3 (cấp API 10) và thấp hơn, sử dụng rác() được khuyến khích. Nếu bạn đang hiển thị số lượng lớn dữ liệu bitmap trong ứng dụng của mình, bạn có thể gặp phải lỗi OutOfMemoryError. Phương thức recycle() cho phép ứng dụng lấy lại bộ nhớ càng sớm càng tốt.

+5

Không cần thiết phải gọi 'recyle'. Nó có thể giúp, nhưng chỉ khi bạn sử dụng nó một cách chính xác. Nó thực sự dễ dàng hơn để tạo một 'WeakReference' thành đối tượng' Bitmap' của bạn và trả về thay vào đó. [Bạn nên xem bài nói chuyện trên Google IO này] (http://www.youtube.com/watch?v=_CruQY55HOk) – adneal

+0

@aneal: cảm ơn, đã xem video đó từ lâu rồi. –

Trả lời

3

trong trường hợp nào tôi nên sử dụng phương pháp này?

Các bitmap được GC 'đánh giá bằng GC bất cứ khi nào nó quyết định. Nhưng trong một số trường hợp, nó có thể bị trì hoãn. Và luôn luôn nhớ quy tắc ngón tay cái trong java (Có thể nó cũng áp dụng cho P.LL). Tốc độ của các đối tượng tái chế theo GC có thể không giống với tốc độ tạo đối tượng. Đôi khi GC bị chậm tái chế.

để tái chế() có nghĩa là nếu bạn muốn giải phóng bộ nhớ càng sớm càng tốt bạn nên gọi rác()

tôi nên sử dụng phương pháp này ở tất cả ??

Đây là một cuộc gọi tiên tiến, và thường không cần phải được gọi là, kể từ khi quá trình GC bình thường sẽ giải phóng bộ nhớ này khi không có nhiều tài liệu tham khảo này bitmap.But nếu bạn đang phải đối mặt với các vấn đề như kích thước bitmap vượt quá ngân sách vm hoặc hết lỗi bộ nhớ thì bạn cần sử dụng điều này.

0

Tôi sử dụng nó trong các hoạt động mà tôi biết rằng bitmap sẽ không được sử dụng nữa.

public static Bitmap getMaskedContactImage (Context context, Bitmap contactImageBitmap, int maskToBeApplied) { 
    Bitmap mask = BitmapFactory.decodeResource(context.getResources(), maskToBeApplied); 
    Bitmap output = Bitmap.createBitmap(mask.getWidth(),mask.getHeight(), Config.ARGB_8888); 
    final Rect finalRect = new Rect(0, 0, contactImageBitmap.getWidth(), contactImageBitmap.getHeight()); 
    final Rect originRect = new Rect(0, 0, mask.getWidth(), mask.getHeight()); 
    Canvas canvas = new Canvas(output); 

    Paint xferPaint = new Paint(Paint.ANTI_ALIAS_FLAG); 
    xferPaint.setColor(Color.BLACK); 

    xferPaint.setXfermode(new PorterDuffXfermode(Mode.DST_IN)); 

    canvas.drawBitmap(contactImageBitmap, finalRect, originRect, null); 
    canvas.drawBitmap(mask, originRect, originRect, xferPaint); 

    contactImageBitmap.recycle(); 
    mask.recycle(); 

    return output; 
    } 

Ở những địa điểm như vậy, tôi chắc chắn sẽ không sử dụng mặt nạ hoặc contactImage.

Tôi đã tìm thấy một tài nguyên thực sự tốt để xử lý bitmap có thể hữu ích Displaying bitmaps.

Trân trọng, Alex

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