メモリリークとその原因についての基本的な知識があります。そのため、コードに問題があるのか、それとも誤検知なのかわかりません。プロジェクトは小さくないので、コードのどの部分を共有するべきかわかりません。ただし、コメント欄でお知らせください。必要なコードを追加します。
ナビゲーションアーチコンポーネントを使用し、MVVMパターンに従います。プロジェクトの開発の後半でLeakCanaryライブラリを追加したところ、画面間を移動すると、保持されたインスタンスに関する警告がすぐに表示され始めました。
この問題は、バックスタックにフラグメントを追加すると発生します。バックスタックにフラグメントを追加するたびに、保持されるインスタンスのカウンターが増加します。LeakCanaryがしきい値の5に達すると、ヒープがダンプされ、レポートが提供されます。
しかし、[戻る]ボタンをクリックして前の画面に戻ると、保持されているインスタンスのカウンターが減少し、最終的に1番目の画面に戻ると、保持されているすべてのインスタンスが消えます。
ヒープ分析レポートを見るとCoordinatorLayout
、XML内の参照である変数coordinatorLayout がリークしていることがわかります。変数とそのすべての使用法を削除してアプリを再度実行すると、同じ問題が発生しますが、別の変数がxml内の別のビューへの参照になっています。LeakCanaryがリークしていると報告したすべてのビューとその使用法を削除しようとしました。TextView
テキストを設定するためだけに使用され、onViewCreated
他の場所では使用されていないがリークしていると言われたとき、コードに問題があることに疑問を感じ始めました。
ライフサイクルメソッドの呼び出しをフラグメントで分析しましたが、前のフラグメントの新しい画面に移動するonDestroyView
と、呼び出されるまでのすべてのメソッドが呼び出されますが、呼び出されませんでしたonDestroy
。[戻る]をクリックするとonDestroy
、バックスタックの上にあるフラグメントが呼び出され、保持されているインスタンスのカウンターが減少します。
ナビゲーションコンポーネントがフラグメントがバックスタックにあるときにフラグメントのインスタンスを保持しており、LeakCanaryがそれをリークとして認識していると思います。
onDestroyView
。