Android Java LifecycleObserver
インターフェースを実装するクラスを構築しています。
これはコンストラクタです:
public MyObserver(AppCompatActivity activity) {
this.mActivity = new WeakReference<AppCompatActivity>(activity);
activity.getLifecycle().addObserver(this);
}
これまでに removeObserver
を呼び出す必要がありますか?
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
public void destroyListener() {
if (this.mActivity.get() != null) {
this.mActivity.get().getLifecycle().removeObserver(this);
}
}
または、永久に観察できますか?
TL; DR:いいえ。
これによると ここにリンク 、ユーザーがAndroid-lifecycles
Githubリポジトリ。この質問に対するGoogle開発者の答えは次のとおりです。
はい、それが新しいライフサイクル対応コンポーネントの要点ですオブザーバの登録を解除/削除する必要はありません。
TL; DR:オブザーバーを使い終わったら明示的に削除するか、LiveData
など、これを自動的に処理するオブザーバーを使用することをお勧めします。
Lifecycle
はabstract
クラスです。したがって、技術的には、実装が何であり、ゲームのルールが何であるかはわかりません。
具体的なLifecycle
はLifecycleRegistry
です。オブザーバーへの強い参照があります。ですから、アクティビティが破棄されたときなどに、LifecycleRegistry
が適時にガベージコレクションされることを期待しています。 FragmentActivity
の場合、そのように見えます。したがって、実際には、これらすべてのものの現在のバージョンでは、オブザーバーの登録を解除せずに逃げることができ、悪影響があったとしてもほとんど影響を受けません。
しかし、それはLifecycle
契約の一部ではありません。おそらく、Lifecycle
の適切な実装(またはLifecycleRegistry
を使用するもの)should登録解除に失敗した場合を適切に処理しますが、リスクはありません。それ。
オーディオサウンドを管理するシングルトンオブジェクトでLifecycleRegistryを使用しています。 LeakCanaryを追加した後、この問題が原因でメモリリークが検出されました。
ただし、removeObserver
を呼び出すと、メモリリークが再び発生することはありません。
したがって、LiveData + LifecycleRegistryを使用する場合は、登録を解除する必要がないことは事実です。しかし、LifecycleRegistryを使用するカスタムコンポーネントの場合、私の経験では、removeObserverの呼び出しはメモリリークを回避するために必須であることが示されています。