2017-09-19 11 views
1

私は以下のタスクを持っています:RXJava。観察可能なままの人口

私はいくつかのメソッドをいくつかのコレクションに追加する必要があるいくつかの方法があります。このメソッドは本当に頻繁に呼び出されるので、値のいくつかのカウントをバッファリングしてからコレクションに値を設定する必要があります。私は、次のコードスニペットがあります

observable 
     .observeOn(notFXThread) 
     .buffer(1, TimeUnit.SECONDS) 
     .subscribeOn(JavaFxScheduler.platform()) 
     .observeOn(JavaFxScheduler.platform()) 
     .subscribe(next -> next.forEach(resultList::addAll)); 

をしかし、私は2つの大きな問題を抱えて:

  1. 私は私が観察初期化する必要があるか理解していないが。
  2. populateメソッドをどのように実装する必要があるのか​​分かりません。

誰かが私を助けてくれることを願っています。

更新1: ObesrverはIDの作成または呼び出し元について何も知らない。オブザーバーにとっては、すべてがどのようにデータを取り込み、どのように実行する必要があるのか​​がわかっています。

+0

'populate'でアイテムを直接返すようにして、RxJavaにコレクションをさせる必要があります。しかし、これは、反応的なストリームが 'id'がどのように生成され、' populate'メソッドを呼び出すかを理解しなければならないことを意味します。あなたはあなたの質問にこれらを追加できますか? –

+0

@ TassosBassoukos、返信ありがとう。私はあなたの条件の質問を更新しました。しかし、私はすでに解決策を見つけましたが、私は自分の評判が増した理由のために、今すぐ投稿するのが良いアイデアであるとは確信していません。 – ZhenyaM

答えて

1

私は次のようにルックスを初期化するので、ソリューション、PublishSubject観察可能なクラスに解決策を見つけた:

public void populate(final Long id) { 
    this.subject.onNext(id); 
} 

this.subject.onNext(id)呼び出し全体に観察スタック:

this.subject = PublishSubject.create(); 
this.subject 
     .observeOn(scheduler) 
     .subscribeOn(scheduler) 
     .buffer(2, TimeUnit.SECONDS) 
     .subscribeOn(JavaFxScheduler.platform()) 
     .observeOn(JavaFxScheduler.platform()) 
     .subscribe(result::addAll); 

populate(long id)方法は次のようになります。

+0

あなたが非常に非効率的/ひどいサイズのコレクション実装をしていない限り、上記のブロックはオリジナルよりも時間がかかるでしょうか? –

+1

@TassosBassoukos、私はあなたが何を意味していると思います。一般的に、あなたは正しいですが、私はいくつかの特別な点があります:それぞれのコレクションの更新は、いくつかの特定のスレッド(ちょうど1つのスレッド)で動作する実際の膨大な数のアクションを生成します。ですから、コレクションに4000値を設定する必要がある場合、 '単純な'実装では1つのスレッドに対して4000個のタスクが生成されます。このスレッドは簡単です。この実装では、このカウントを約10回減らします(私はそれを測定しませんが、10回以上と思います)。 – ZhenyaM

+0

ええ、私はあなたがJavaFxを使用していたことに気付きました。私はdraw callやsomesuchを生成していると思いますか?ええ、バッファリングが大いに役立つでしょう!そして、あなた自身の質問に答えるために、これを覚えておいてください。https://xkcd.com/979/ –

関連する問題