負荷テストと称して高速画面遷移をしてたらメモリ足りなくて落ちた。
かちかちかちかちかちかちかち、
たたーん!
アッーーーーー!!
ダメぜったい!
staticなLiveDataを作るとメモリリークの原因になる。
仕組み
- staticなLiveDataをobserveする際に、ActivityやFragment内からラムダ式などによってobserverを設定する。
※ラムダ式には生成したクラスのインスタンス参照が含まれる。 - 画面遷移するとActivityやFragmentが破棄されてもstaticなLiveData内にラムダ式が残るため、結果LiveDataだけが参照するActivityやFragmentが出来上がる。
- これをProfilerでチェックするとActivityやFragmentがLeak報告される。
個人的解決策
staticな場所で発生したデータをLiveDataで共有したかったため、解決策を考えた。
- 弱参照で値を保持するHashSetを作成する。
- staticメソッドでMutableLiveDataをインスタンス化し、
- staticな場所の弱参照SetにMutableLiveDataを保持し、
- データ更新時は弱参照SetにMutableLiveDataが残っていればsetValueする。
どのような方法であっても画面間でLiveDataインスタンスを共有してしまうと、
やはりメモリリークを起こす恐れがあるため、
LiveDataとObserverの生存期間について常に注意を払う必要がある。
以上。