バックグラウンドタスクを発生させるアクティビティがたくさんあります。バックグラウンドタスクがアクティビティでイベントを発生させることができるように、アクティビティはリスナーコールバックを実装したものとして自分自身を渡します。次に、アクティビティはUIに何かを表示して、バックグラウンドアクティビティが成功または失敗したことを示すことができます。
または、 EventBus を使用することもできます。ここで、アクティビティを取得して、リスナー/サブスクライバーとして登録します。バックグラウンドタスクでEventBusでイベントを発生させ、それをリッスンしているアクティビティで処理できます。
どちらが他方よりも優れている点は何ですか?いつ使用しますか? (コードの清浄度?パフォーマンス?警告?)
フォローアップ-私はEventBusを使用することになりました。コードは間違いなく非常にクリーンであり、コールバックがどこにでもぶら下がっているわけではありません。 IDE(IntelliJ)はonEvent
メソッドが使用されていないと考えているので、アノテーションを作成しました
@Target({ElementType.METHOD})
public @interface EventBusHook {}
onEvent
メソッドの上に配置しました。次に、Alt +クリックして、IntelliJに未使用として扱わないように依頼しました。
@EventBusHook
public void onEvent(MyEventType myEventType){
EventBusを使用する利点:
しかし、悪い部分は、IDEがオートコンプリートを支援できなかったため、関数宣言でもう少し頭痛がする可能性があることです。
私の提案は、カスタムリスナーを作成する必要がある場合は、EventBusを検討してください。すべてではないにしても、ほとんどの要件/ケースに適している可能性があります。
とにかく、結局のところそれはすべてあなたの選択です=)
@nnuneoiの答えに同意しません。
イベントバスには、1つの利点があります。それは、互いの存在を「認識していない」コンポーネント間の通信を可能にすることです。
そして、いくつかの欠点があります。
これらすべての欠点を考えると、単純なコールバックをデフォルトの実装選択にする必要があります。
イベントバスは、直接結合が望ましくない場合、または実装が難しい場合にのみ使用してください。例えば:
Service
からActivity
へのイベントの送信Fragments
間でイベントを交換する通信するコンポーネントがすでに互いの存在を「認識」している場合は、イベントバスを介して通信する必要はありません。
イベントがセマンティックビューでグローバルに一意であるかどうかを確認する必要があります。加入者がイベントに興味があるかどうか。そうでなければ、彼は購読すべきではありません。
パブリッシャーとサブスクライバーの関係が本当にある場合は、イベントバスメカニズムが適切です。イベントは、受信者から完全に独立している必要があります。
したがって、何らかの理由でイベントを破棄するサブスクライバー(「登録されていてもイベントに責任を負わない」)は、Event-Busの使用が間違っていることを示す強力な指標です。次に、専用のリスナーの使用を検討する必要があります。
疎結合とよりクリーンなコードのために、 EventBus を使用します。また、GreenrobotなどのEventBusを使用すると、すべての定型文が自動的に実行され、アクティビティライフサイクルメソッド(onStartおよびonDestroy | onStop)からオブザーバーを登録および登録解除できるのは素晴らしいことです。コールバックを実装し、それらのコールバックのアクティビティライフサイクル管理を制御することは、不必要な頭痛の種であり、多くの不必要な定型文を伴います。
また、 明らかにすべてのガベージコレクターは弱い参照が素晴らしいと考えています -イベントバスはオブザーバーとコンポーネントにまさにそれを提供します。 オブザーバーパターン の基礎です。