2017-05-09 4 views
0

RxJavaを初めて使用しています。 私が達成したいのは、あらゆるキープレスがリクエストである検索機能です。また、私は明示的に要求を呼び出すことができるようにしたい。RxBinding textViewとPublicSubjectを結合するには?

は、だから私は、最初の部分のために

RxTextView.textChanges(editText) .debounce .flatmap(request)を使用しました。すべてが機能します。

しかし、手動でリクエスト部分を呼び出すと、私は立ち往生しました。私はそれを回避することができますそれを暗示的にonTextChangeをトリガするeditText.setText(editText.getText)しかし、それは汚い感じ。

トピックを調査したところ、PublishSubjectが見つかりました。私は私が観察textChangesと要求件名に参加することができます方法はあり、それにactuall要求部を抽出し、この

mPublishSubject. 
.doOnNext(.. show progressbars..) 
.flatMap(..request..) 
.subscribe(.. display data...) 

のようにちょっと見えますか?言い換えれば、どのようにしてtextChangesストリームが検索対象ストリーム内で継続できるのですか? text observablesサブスクライバonNextからmPublishSubject.onNextを呼び出す以外にも、

答えて

2

私が正しく理解している場合は、TextViewの各ユーザーテキストキーをマッピングするか、キープレスとは独立したある時点で明示的な呼び出しを行うかのいずれかで、要求を発する必要があります。

リクエストトリガーの2つのストリームを作成する必要があります.1つはRxTextViewで、もう1つはPublishSubjectです(リクエストの際に値(テキスト文字列)が出力されます)。テキストを発する一つのストリームを取得するには、この2つのストリームをマージして、テキストの排出量のいずれかに応じてイベントを発生、このような何かその後、手動で要求をトリガするために

Observable.merge(
     RxTextView.textChanges(editText) 
       .debounce(DEBOUNCE_VALUE, TimeUnit.MILLISECONDS), 
     mPublishSubject) 
      .flatMap(text -> fireRequest(text)) 
      .subscribe(...); 

、次のようなメソッドを持つことができます:

private void manualRequestTrigger(String text) { 
    mPublishSubject.onNext(text); 
} 

また、リクエストの結果は、国連がとても古い要求が新規の方の後に終了することができ、注文放出されるconcatMap代わりにflatMapと同様にflatMapのを使用して検討すべきである、とあなたは、古いデータを使用してUIを更新します。

+0

ありがとう、ありがとう – urSus

関連する問題