Saya memiliki pengetahuan dasar tentang kebocoran memori dan apa yang dapat menyebabkannya. Itu sebabnya saya tidak mengerti jika saya memiliki masalah dalam kode saya atau itu positif palsu. Saya tidak tahu bagian mana dari kode yang harus saya bagikan karena proyeknya tidak kecil. Tapi beri tahu saya di komentar dan saya akan menambahkan kode yang diperlukan.
Saya menggunakan komponen lengkung navigasi dan mengikuti pola MVVM. Saya menambahkan perpustakaan LeakCanary kemudian dalam pengembangan proyek dan segera mulai memberi saya peringatan tentang contoh yang disimpan ketika saya menavigasi antara layar.
Masalahnya terjadi ketika saya menambahkan fragmen ke tumpukan belakang. Dengan setiap fragmen yang ditambahkan ke tumpukan belakang penghitung contoh dipertahankan meningkat. Ketika mencapai nilai ambang 5 LeakCanary, dump heap dan memberikan laporan.
Tetapi jika saya mengklik tombol kembali dan kembali ke layar sebelumnya maka counter dari contoh yang disimpan menurun dan akhirnya, ketika kembali ke layar 1 semua contoh yang disimpan menghilang.
Jika saya melihat laporan analisis tumpukan itu mengatakan bahwa variabel coordinatorLayout yang merupakan referensi ke CoordinatorLayout
dalam xml telah bocor. Jika saya menghapus variabel dan semua penggunaannya dan menjalankan aplikasi lagi saya melihat masalah yang sama, tetapi sekarang dengan variabel lain yang merupakan referensi ke tampilan lain di xml. Saya mencoba untuk menghapus semua tampilan dan penggunaannya yang dilaporkan LeakCanary bocor. Ketika dikatakan bahwa TextView
, yang hanya digunakan untuk mengatur teks onViewCreated
dan tidak digunakan di tempat lain, bocor saya mulai ragu bahwa ada masalah dalam kode saya.
Saya menganalisis panggilan metode siklus hidup dalam fragmen dan memperhatikan bahwa ketika saya menavigasi ke layar baru untuk fragmen sebelumnya semua metode sampai dan termasuk onDestroyView
dipanggil tetapi tidak onDestroy
. Ketika saya mengklik kembali onDestroy
dipanggil untuk fragmen yang berada di atas tumpukan kembali dan disimpan contoh penghitung menurun.
Saya menduga bahwa komponen Navigasi menyimpan instance dari fragmen ketika berada di tumpukan belakang dan LeakCanary melihatnya sebagai kebocoran.
onDestroyView
dengan View Binding.