9

Android アプリケーションでEventBusを使用しています。Eventbus.getDefault().register(this)で a を実行するのは良い考えApplication.onCreate()ですか? UI を更新する必要はありません。アプリがバックグラウンドになった場合でも、サブスクリプション データを確実に受信できるようにするために、これを試みています。私が望むものを達成する他の方法があるかもしれませんが、このアプローチに何か問題があるかどうか知りたいです.

私の疑問は次のとおりです。

  1. これにより、何らかのメモリリークが発生しますか? Eventbus は Application オブジェクトを参照しており、Application オブジェクトも Eventbus に依存しています。これは周期的に見えます。

  2. いつ登録を解除しますか? Application.onTerminate() が呼び出される保証はありません。1.が問題なければ、Applicationクラスのunsubscribeは無視でいいと思います。

4

2 に答える 2

9

これにより、何らかのメモリリークが発生しますか? Eventbus は Application オブジェクトを参照しており、Application オブジェクトも Eventbus に依存しています。これは周期的に見えます。

Application クラスから直接イベントをサブスクライブしてもまったく問題ありません。OS はアプリケーションをクリーンアップし、EventBus はその一部です。問題はありません。

いつ登録を解除しますか? Application.onTerminate() が呼び出される保証はありません。1.が問題なければ、Applicationクラスのunsubscribeは無視でいいと思います。

はい、完全を期すために、onTerminate も登録解除します。しかし、あなたは Android デバイスを使用しています。アプリケーションがクリーンアップされた場合、とにかくすべてが消えてしまうので、「クリーンアップ」する必要はありません。

于 2016-02-26T17:07:41.970 に答える
0

アプリが物理的に停止すると、Application クラスは強制終了されます。

つまり:

  1. OS がアプリを物理的に停止することを決定した場合 (これが発生するまでに数日かかる場合があります)、または外部からの介入がある場合 (つまり、ユーザーが停止するか、Clean Master のようなユーティリティ アプリが停止する場合)、アプリは完全に停止され、破棄されます。
  2. 静的参照もメモリから削除されます (つまり、EventBus シングルトンのもの)。

(2) は、リスナーを適切に登録解除する場合、つまり、停止時にアクティビティ/フラグメントを登録解除するか、View.onDetachedFromWindow()などのときにビューを登録解除する場合にのみ有効です。

イベント コールバック メソッドで、別のスレッドで何かを実行したり、存在しないアクティビティ/ビュー/フラグメントを更新したりしない限り、問題はありません。

于 2015-11-20T23:11:10.203 に答える