5

onDestroyリスナーの登録を解除するまで待つことに潜在的な害があるかどうかを理解しようとしています。特にイベントバス (otto) からのサブスクライブ解除について言及していますが、その答えはほとんどのlistener pattern実装 ( SharedPreferenceListenerLocationListenerstatic参照など) に当てはまると思います。

「onDestroy が呼び出されることが保証されていない」というフレーズを引用している、この問題に対する他のいくつかの 回答を見てきました。完全なonDestroy ドキュメントテキストは実際には次のように書かれています。

注: このメソッドがデータを保存する場所として呼び出されるとは考えないでください。たとえば、アクティビティがコンテンツ プロバイダのデータを編集している場合、それらの編集は、ここではなく、onPause() または onSaveInstanceState(Bundle) でコミットする必要があります。このメソッドは通常、アクティビティに関連付けられているスレッドなどのリソースを解放するために実装されます。これにより、アプリケーションの残りの部分がまだ実行されている間に、破棄されたアクティビティがそのようなリソースを残さないようにすることができます。システムがこのメソッド (または他のメソッド) を呼び出さずにアクティビティのホスティング プロセスを単純に強制終了する状況があるため、プロセスがなくなった後も残り続けることを意図したことを行うために使用しないでください。

これは、アプリケーション プロセスが強制終了される前に呼び出されない可能性があるため (ライフサイクル図が示すように)、データの保存onDestroyには使用しないことを意味すると理解しています。

簡単に言えば、 onDestroy が呼び出されないために、リスナーとして登録されたアクティビティがリークする可能性がある状況はありますか?

4

1 に答える 1

5

onDestroy が呼び出されないために、リスナーとして登録されたアクティビティがリークする状況はありますか?

私が考えることができるわけではありません。ただし、次の場合とは異なります。

onDestroy でのリスナーの登録解除 - 害は何ですか?

onPause()以前のライフサイクル メソッド ( /など)でリスナーを登録解除する理由onStop()は、アクティビティがフォアグラウンドにない場合、それらのイベントを必要としないためです。

アプリケーションは、ユーザーが [戻る] ボタンを押した後、ユーザーがアプリ内の同じ場所に戻るなど、アクティビティが破棄された場合に既に対処する必要があります。アクティビティの新しいインスタンスを作成する必要があり、そのアクティビティ インスタンスは、データ ソースから表示する必要があるものをすべて取得する必要があります。したがって、そのコードが機能する場合は、同じ「必要なものを取得する」ロジックを使用して、フォアグラウンドに戻ったときに既存のアクティビティ インスタンスを更新できます。IOW、データを取得する場所に関して、新しく作成されたアクティビティと同じように、戻るアクティビティを扱います。

于 2014-04-07T23:01:25.080 に答える