2012-12-07 32 views
7

Có ai biết cách phát hành bitmap từ android.view.GLES20DisplayList không. Và tại sao nó giữ chúng sống ngay cả khi bạn làm sạch, hãy nói, ImageView theo cách thủ công? Hoặc có thể có một cách để vô hiệu hóa GLES20DisplayList, cố gắng sử dụng android: hardwareAccelerated = "false" trong AndroidManifest, vẫn không có may mắn.Bản phát hành bitmap từ android.view.GLES20DisplayList

Hình như chỉ ảnh hưởng trong 4,2 (1)

cập nhật: (? Bug) vẻ như bạn không thể vô hiệu hóa khả năng tăng tốc phần cứng trên 4.2.1

đơn giản kiểm tra:

Android manifest: 
application ... android:hardwareAccelerated="false" 

System.out.println("isHardwareAccelerated: " + mListView.isHardwareAccelerated()); 
mListView.setLayerType(LAYER_TYPE_SOFTWARE, null); 
System.out.println("isHardwareAccelerated: " + mListView.isHardwareAccelerated()); 

kết quả:

12-06 17:15:27.129: I/System.out(30752): isHardwareAccelerated: true 
12-06 17:15:27.129: I/System.out(30752): isHardwareAccelerated: true 

Trả lời

3

Điều này dường như b e rò rỉ bộ nhớ trong 4.2. Dường như sửa chữa này nhằm chống lại nó: https://android.googlesource.com/platform/frameworks/base/+/034de6b1ec561797a2422314e6ef03e3cd3e08e0

Tôi đã tắt tăng tốc phần cứng trong tệp kê khai cho 4.2 đối với hoạt động mà tôi gặp sự cố này, điều này đã giúp giữ bộ nhớ android.view.GLES20DisplayList.

Trong manifest cho hoạt động: android:hardwareAccelerated="@bool/gpu_enabled"

Trong values.xml cho v17:

<bool name="gpu_enabled">false</bool> 

Trong values.xml mặc định, tôi đặt nó là true.

+1

Điều này xảy ra vì chúng giữ bitmap cho đến khi chế độ xem bị xóa. Đây là bình luận từ GLES20DisplayList: /* Những danh sách này đảm bảo rằng mọi Bitmap và DisplayLists được ghi bởi một DisplayList được giữ nguyên miễn là DisplayList vẫn còn sống. Các danh sách Bitmap và DisplayList được điền bởi GLES20RecordingCanvas trong các cuộc gọi vẽ thích hợp và được xóa khi bắt đầu một khung vẽ mới hoặc khi khung nhìn được tách ra khỏi cửa sổ. */Về cơ bản bạn cần tách xem để có thể tái chế bitmap/drawable. – vovkab

+0

Tôi đã xóa các chế độ xem trong onStop, bộ nhớ vẫn đang được giữ. (chỉ trên 4.2) –

+0

Trình phân tích bộ nhớ nào hiển thị? Có thể ai đó đang giữ tài liệu tham khảo hoặc ngữ cảnh bị rò rỉ? Cố gắng làm sạch bitmap hoàn toàn từ ImageViews và sau đó tách chế độ xem. – vovkab

1

Gần đây tôi đã thực hiện phân tích bộ nhớ chuyên sâu về vấn đề này. Như Yulia đã chỉ ra ở trên, việc vô hiệu hóa khả năng tăng tốc phần cứng sẽ thực hiện thủ thuật nói chung. Ngoài ra, bạn có thể đặt Drawable của ImageView thành null, tái chế bitmap hoặc tách ImageView như bạn đã chỉ ra.

Tuy nhiên, tùy thuộc vào phiên bản API, bộ nhớ bitmap có thể hoặc không thể được phát hành từ GLES20DisplayList. Tôi đã thảo luận các hành vi khác nhau và các giải pháp có thể có chiều sâu trên my blog post – Android Bitmap Memory Analysis, nhưng giải pháp nhanh chóng là tắt tăng tốc phần cứng.

+1

Cảm ơn bài đăng trên blog của bạn, nó thực sự giúp hiểu đầy đủ vấn đề –

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