2017-01-05 17 views
6

Tôi tò mò lý do tại sao dưới đây là một rò rỉ bộ nhớ vì mHandler được tạo trên mainThread và bây giờ khi onDestroy được gọi là wont nó chỉ giết thread? làm thế nào người xử lý có thể tồn tại sau khi hoạt động bị phá hủy? tôi chưa tạo chủ đề mới. Tôi có hiểu rằng một xử lý nếu nó có những thứ tôi hàng đợi tin nhắn sẽ vẫn còn ngay cả sau khi một sợi bị phá hủy?Android - trình xử lý chính có thể gây ra rò rỉ bộ nhớ không?

Các tài liệu tham khảo doc im đọc là here enter image description here

Trả lời

13

Trình xử lý chủ yếu được sử dụng để đăng sự kiện vào MessageQueue của Chủ đề. Mỗi trường hợp Trình xử lý được liên kết với một chuỗi đơn lẻ và hàng đợi tin nhắn của chuỗi đó.

vì vậy khi bạn gửi một Runnable với một sự chậm trễ, và thoát khỏi các hoạt động, các MainThread sẽ không bị hủy diệt, như vẫn còn có những sự kiện trong MessageQueue để được xử lý sau khi một sự chậm trễ, vì vậy điều này có thể gây ra một memoryLeak là lớp bên trong ẩn danh của bạn của runnable đang giữ tham chiếu của hoạt độngdụ.

do đó hãy chắc chắn để loại bỏ tất cả các tin nhắn trong onStop() của Hoạt động bằng cách gọi

handler.removeCallbacksAndMessages(null); 

này sẽ xóa tất cả các tin nhắn đang chờ và callbacks trước khi rời khỏi hoạt động của bạn.

+0

để bạn nói nếu một người xử lý có thư trong hàng đợi, nó phải tiếp tục chạy ngay cả khi hoạt động được tạo khi kết thúc, đúng không? – j2emanue

+0

Và trong trường hợp ví dụ của tôi, trình xử lý được liên kết với mainThread. và tôi đang đăng runnables cho chủ đề chính looper. bây giờ khi hoạt động gọi onDestroy vì có tin nhắn vẫn còn trong hàng đợi chính của lThủ công, GC sẽ không thu thập hoạt động? hoặc là GC sẽ không thu thập các hoạt động vì các tài liệu tham khảo các runnable giữ? Xem những gì tôi có ý nghĩa? Cho phép nói runnable đã không có một tài liệu tham khảo hoạt động? nó sẽ bị rò rỉ? – j2emanue

+0

@ j2emanue nếu runnable của bạn không giữ bất kỳ tham chiếu hoạt động nào, trong trường hợp đó rò rỉ hoạt động sẽ không xảy ra, nhưng vẫn chủ đề chính sẽ còn sống vì nó phải hoàn thành các sự kiện trong hàng đợi Tin nhắn được đăng bởi runnable. –

0

Họ có thể, nhưng không phải của Handler- của Runnable đó là đăng. Cách mà một Handler làm việc là nó được liên kết với một Thread. Chủ đề đó phải có một Looper. Một Looper có một hàng đợi tin nhắn. Khi bạn postDelayed, bạn thêm Runnable vào hàng đợi của Looper. Vì vậy, chính Thread có một tham chiếu đến Runnable. Vì vậy, Runnable sẽ bị rò rỉ, và nếu không tĩnh lớp cha sẽ bị rò rỉ.

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