2012-10-23 31 views
6

Tôi có một hoạt động mà trông giống như sau:Rò rỉ bộ nhớ trong android.os.Message và/hoặc Handler.removeCallback?

class MyActivity extends Activity { 
    Runnable refreshTimer = new Runnable() { 
     public void run() { 
      refresh(); 
     } 
    }; 

    protected onCreate(...) { 
     handler.postAtTime(refreshTimer, ...); 
    } 

    protected onDestroy() { 
     handler.removeCallbacks(refreshTimer); 
    } 

    protected void refresh() { ... } 
} 

Sau onDestroy được gọi là, vẫn còn tin nhắn trong MessageQueue của hoạt động có chứa tham chiếu đến MyActivity $ 0 (refresh Runnable) đối với một số lý do. Bởi vì MyActivity $ 0 có một tham chiếu ngầm định đến MyActivity, điều này gây ra rò rỉ bộ nhớ của bối cảnh MyActivity.

Kết quả của merge_shortest_paths cho android.app.Activity trừ ma,, yếu, vv tài liệu tham khảo mềm sử dụng Eclipse Memory Analyzer Tool: enter image description here

(Mã nguồn trên là một việc đơn giản hóa các mối quan hệ đối tượng thực tế hiển thị trong bãi chứa MAT)

Không nên gọi removeCallbacks xóa mọi tham chiếu đến đối tượng runnable khỏi Hàng đợi? Tại sao tôi bị rò rỉ bối cảnh?

Trả lời

2

Something thử:

Theo các tài liệu android:

OnDestroy: Cuộc gọi cuối cùng bạn nhận được trước khi hoạt động của bạn bị phá hủy. Điều này có thể xảy ra do hoạt động kết thúc (ai đó gọi là kết thúc() trên đó, hoặc vì hệ thống tạm thời phá hủy trường hợp này của hoạt động để tiết kiệm không gian.Bạn có thể phân biệt giữa hai kịch bản này với phương thức isFinishing()

Khi bạn thoát khỏi hoạt động của bạn, có vẻ như vẫn còn một loạt các thông điệp xếp hàng và bối cảnh cho huỷ đăng ký không gọi gọi lại hủy

gì bạn cần làm là unregister bạn Runnable trong onPause:. này gọi lại chủ yếu được sử dụng để lưu bất kỳ trạng thái liên tục nào mà hoạt động đang chỉnh sửa, để trình bày mô hình "chỉnh sửa tại chỗ" cho người dùng và đảm bảo không có gì bị mất nếu không có đủ tài nguyên để bắt đầu w hoạt động mà không đầu tiên giết chết này. Đây cũng là một nơi tốt để làm những việc như ngừng hoạt ảnh và những thứ khác tiêu thụ lượng CPU đáng chú ý để chuyển sang hoạt động tiếp theo nhanh nhất có thể hoặc đóng tài nguyên độc quyền như máy ảnh.

Thông thường một Receiver hoặc "lên lịch" Runnable sẽ đăng ký trong onResume, và unregister trong onPause cho tốt hơn vòng đời cặp

Nếu không nhìn thấy những gì bạn đang làm trong làm mới, đó là khó khăn để nói, nó có thể bị rò rỉ do tham chiếu hoạt động là phạm vi hoạt động được tham chiếu trong phương thức làm mới.