2012-01-20 61 views
12

Cho đến bây giờ tôi đang sử dụng SoftReference Bộ nhớ cache cho hình ảnh trong Android. Bộ nhớ đệm này được sử dụng cho các hình ảnh được hiển thị trong ListView và sẽ giúp giữ hình ảnh của các mục trong bộ nhớ không được hiển thị trên màn hình, nếu còn đủ bộ nhớ.Làm cách nào để triển khai bộ nhớ cache hình ảnh trong bộ nhớ trong Android?

Vấn đề với điều này là SoftReferences là rác được thu thập gần ngay tại thời điểm tài liệu tham khảo cứng cuối cùng được phát hành. Kết quả của việc này là một hình ảnh được lấy ra khỏi màn hình là rác được thu thập tại thời điểm đó và nếu người dùng cuộn trở lại mục nhập này trong ListView, hình ảnh được tải lại từ bộ nhớ điện thoại nội bộ sẽ dẫn đến quá trình tải phức tạp. thường xuyên vẽ lại danh sách và hiệu suất chung chung.

bug request cho hành vi tham chiếu mềm nêu rõ đây là hành vi dự định và bạn nên sử dụng LRU-Cache để lưu vào bộ nhớ cache loại nội dung này.

Biết câu hỏi của tôi. Bộ nhớ cache LRU sẽ chỉ chiếm nhiều bộ nhớ như tôi cho phép. Nhưng nếu ứng dụng cần nhiều bộ nhớ thì nó sẽ không giải phóng bộ nhớ. Làm thế nào tôi nên xác định có bao nhiêu bộ nhớ tôi có thể cho phép Cache để sử dụng, và có cách nào để giảm kích thước của bộ nhớ cache nếu tình hình bộ nhớ của điện thoại trở nên chặt chẽ?

Hiện tại, bộ nhớ cache hình ảnh được lưu bên trong ứng dụng dưới dạng một loại lưu trữ hình ảnh toàn cầu cho tất cả các hoạt động. Điều này sẽ dẫn đến ứng dụng của tôi liên tục sử dụng tất cả bộ nhớ của bộ nhớ cache hình ảnh ngay cả khi các hoạt động của tôi ở chế độ nền hoặc bị hủy.

Trả lời

3

Giữ các quy trình nền còn hoạt động là một tối ưu hóa ở cấp hệ điều hành giúp việc chuyển đổi trở lại quy trình của bạn nhanh chóng. Quá trình của bạn sẽ vẫn còn sống chỉ miễn là hệ điều hành có thể đủ khả năng bộ nhớ; khi bộ nhớ đó là cần thiết cho một ứng dụng khác, quá trình của bạn sẽ bị giết và các tài nguyên của nó sẽ được giải phóng.

Nếu bạn giải phóng bộ nhớ cache của mình mỗi khi quá trình của bạn được tạo nền, việc chuyển về ứng dụng của bạn sẽ không còn nhanh nữa vì nó sẽ thấy bộ nhớ cache bị thiếu. Điều này đánh bại việc tối ưu hóa quá trình xử lý nền của Android!

Bạn chỉ nên sử dụng LruCache, cũng được bao gồm trong các Android Support Package cho các bản phát hành trước Android 3.0 (Honeycomb).

+0

cảm ơn bạn vì câu trả lời – Janusz

+0

Tôi không thể thấy cách sử dụng LruCache sẽ khắc phục sự cố lưu trữ hình ảnh hoặc bất kỳ BLOB nào khác cho vấn đề đó. Vấn đề là kích thước cố định của nó, trong đó mỗi mục giữ một tham chiếu mạnh mẽ đến đối tượng được lưu trữ. Điều đó sẽ không mở rộng với bộ nhớ của thiết bị. – Matthias

+0

LruCache đuổi các mục khi kích thước của nó vượt quá giới hạn bạn đã đặt. Bạn có thể ghi đè lên một phương thức để giúp LruCache đo kích thước của mỗi mục nhập. –

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