Tôi có kiến thức cơ bản về rò rỉ bộ nhớ và những gì có thể gây ra chúng. Đó là lý do tại sao tôi không hiểu nếu tôi gặp vấn đề trong mã của mình hoặc đó là dương tính giả. Tôi không biết phần nào của mã tôi nên chia sẻ vì dự án không nhỏ. Nhưng chỉ cần cho tôi biết trong các ý kiến và tôi sẽ thêm mã yêu cầu.
Tôi sử dụng thành phần vòm điều hướng và theo mô hình MVVM. Tôi đã thêm thư viện LeakCanary sau này trong quá trình phát triển dự án và nó ngay lập tức bắt đầu đưa ra cảnh báo cho tôi về các trường hợp được giữ lại khi tôi điều hướng giữa các màn hình.
Vấn đề xảy ra khi tôi thêm các mảnh vào ngăn xếp trở lại. Với mỗi mảnh được thêm vào ngăn xếp phía sau, bộ đếm của các thể hiện được giữ lại tăng lên. Khi nó đạt đến giá trị ngưỡng của 5 LeakCanary sẽ bỏ đống và cung cấp báo cáo.
Nhưng nếu tôi nhấp vào nút quay lại và quay lại màn hình trước thì bộ đếm của các trường hợp được giữ lại sẽ giảm và cuối cùng, khi trở lại màn hình thứ nhất, tất cả các trường hợp được giữ lại sẽ biến mất.
Nếu tôi nhìn vào các báo cáo phân tích heap, nó nói rằng bộ điều phối biếnLayout có tham chiếu đến CoordinatorLayout
xml đã bị rò rỉ. Nếu tôi loại bỏ biến và tất cả việc sử dụng nó và chạy lại ứng dụng, tôi sẽ thấy vấn đề tương tự, nhưng bây giờ với một biến khác là tham chiếu đến một chế độ xem khác trong xml. Tôi đã cố xóa tất cả các lượt xem và cách sử dụng của chúng mà LeakCanary báo cáo là bị rò rỉ. Khi nó nói rằng a TextView
, chỉ được sử dụng để đặt văn bản onViewCreated
và không được sử dụng ở bất kỳ nơi nào khác, tôi bị rò rỉ, tôi bắt đầu nghi ngờ rằng có một vấn đề trong mã của mình.
Tôi đã phân tích các cuộc gọi phương thức vòng đời theo từng mảnh và nhận thấy rằng khi tôi điều hướng đến màn hình mới cho đoạn trước đó, tất cả các phương thức cho đến khi onDestroyView
được gọi nhưng không được gọi onDestroy
. Khi tôi nhấp trở lại onDestroy
được gọi cho đoạn nằm trên đỉnh ngăn xếp trở lại và bộ đếm giữ lại giảm.
Tôi nghi ngờ rằng thành phần Điều hướng đang giữ ví dụ của một đoạn khi nó nằm trong ngăn xếp phía sau và LeakCanary đang xem nó là một rò rỉ.
onDestroyView
Chế độ xem liên kết hay không.