RxJavaでEventBusを実装したいので、スティッキーイベントが必要です。私はBehaviorSubjectを使うことができますが、タイプ(クラス名)によって異なるすべてのイベントをキャッシュしたいときに、最後に発行されたアイテムだけをキャッシュします。 ReplaySubjectにはオーバーヘッドがありますが、放射された要素はすべて保持されています。 タイプ要素によってユニークなReplaySubjectを作成する方法はありますか?リプレイ別個の要素を持つサブジェクト
答えて
私はクリーンな解決策があるとは思わない。しかし、あなたはこの仕事をすることができるかもしれません。
- イベントタイプごとに
BehaviorSubject<>
を作成します。ConcurrentMap
を使用して、到着する各イベントを正しいSubject
にディスパッチします。 - イベントの到着順にそれらのサブジェクトのリストを維持します。
- 新しいサブスクリプションが受信されると、すべてのサブジェクトのマージであるオブザーバブルが作成されます。サブジェクトの最初のリストは、すでにイベントを受信しています。
これは、上記を明確にするコードです。テストされていない。
// The subscription operation will perform a merge of the two lists
Map<EventType, BehaviorSubject<Event>> map = new ConcurrentHashMap<>();
List<BehaviorSubject<Event>> listOfUnseenEvents = new ArrayList<>();
List<BehaviorSubject<Event>> listOfSeenEvents = new ArrayList<>();
// ...
listOfUnseenEvents = map.values().asList();
public Observable<Event> busSub() {
List<BehaviorSubject<Event>> allEvents = new ArrayList<>();
synchronized (map) {
allEvents.addAll(listOfSeenEvents);
allEvents.addAll(listOfUnseenEvents);
}
return Observable.merge(allEvents);
}
// receive an event and dispatch it
eventSource
.subscribe(event -> processEvent(event));
public void processEvent(Event event) {
BehaviorSubject<Event> eSubject = map.get(event.getEventType());
synchronized (map) {
if (containsEventType(listOfSeenEvents, event.getEventType())) {
removeEventType(listOfSeenEvents, event.getEventType());
} else {
removeEventType(listOfUnseenEvents, event.getEventType());
}
listOfSeenEvents.add(eSubject);
}
eSubject.onNext(event);
}
このコードはmerge()
が順番に与えられた観測のそれぞれに加入するという事実を利用していますのでご注意ください。 RxJavaのドキュメントにそのような保証はありません。
すべてのイベントタイプがあらかじめわかっていない場合、これは機能しません。
考えてくれてありがとう、私は見たイベントと見えないイベントを区別する必要はないので、単純化することができます。また、すべてのイベントタイプが未定義の場合、なぜこれは機能しませんか?特定のタイプのイベントのみを投稿するだけで十分です。 – Buckstabue
サブジェクトに最終的にそれらのタイプのイベントが表示されるように、「見えない」イベントサブジェクトが必要です。それ以外の場合は、各サブスクライバに対して「分類されていない」サブジェクトと、分類されていないサブタイプに分類されるイベントタイプのリストが必要です。 –
- 1. 個別のクリック観測機能を持つ要素内の要素のクリックを観測
- 2. recycleViewを持つ要素の個々のクリックを処理する
- 3. Aerospikeのリスト要素の個別のTTL
- 4. LINQ内の別個の要素
- 5. PYTHON:n個の要素を持つ配列を作成する
- 6. 'this'を持つ個々のクラス要素を参照
- 7. 10個以上の要素を持つキーのSortByKey()
- 8. n個の要素を持つ配列の最大数
- 9. ダスクアレイのn個の個別の要素のスライシング
- 10. 個別のボックスプロットデータを持つgeom_path
- 11. 個別のリポジトリを持つgit-tf
- 12. Swift - 別個のsearchResultsControllerを持つUISearchController
- 13. 別個のイベントハンドラを持つグリッド
- 14. OpenIdオプションを持つMVC個別のユーザーアカウント
- 15. 複数の要素のビヘイビアの個別表示/非表示を個別に
- 16. PHP配列個別要素崩壊
- 17. ある要素のNと別の要素のMの別個の順列の数式について
- 18. HTML要素にいくつかの別個のクラス属性を持つことは有効ですか?
- 19. 2つの識別子を持つクラスで要素を選択
- 20. 2つの別々のonClickイベントを別々の要素内に持つ方法
- 21. [stimulsoft]:3つの別個の詳細を持つ1つのマスター
- 22. <n個の複雑さを持つベクトルの要素を消去する
- 23. 別の要素を持つ配列のRubyメソッド
- 24. 個々の配列の要素を個別に接続する方法
- 25. N個の非零要素を持つランダムなスパース行列を生成する
- 26. 100000個の要素を持つリストの不思議な振る舞い
- 27. 個別のデータベースを持つ2つのappengineクライアント
- 28. TSQL:私はテーブルを持つ2つの別個のテーブル
- 29. 同じクラス名を持つ複数のdivに個別の操作が必要
- 30. LINQ:以下のリストを与えられた個別の要素
あなたは 'Subject'でそれらを放出する前に項目をフィルタリングすることができます。したがって、彼らは 'Subject'で受け取ったときにタイプによって既にユニークになるでしょう。 – masp
@maspイベントバスです。それは無限の流れのようなものです。どのくらいのアイテムを放出するのかわからないので、それらを収集して対象に送信する前にフィルタリングすることはできません – Buckstabue
最新の要素をタイプ別にキャッシュしますか?次に、複数のBehaviorSubjectsまたはReplaySubjectsを持ちます。タイプごとに1つずつ、タイプの安全性も提供されます。 – akarnokd