2017-06-28 4 views
0

QAチームによって実行されるテストの1つは、いくつかのボタンを熱心にタップして、1つのイベントだけが実行されることを確認することです。この動作を保証するためにRxJavaを使用することは可能ですか?私はRxJavaからthis backpressure pageを読むことを試みましたが、私はそれを本当に理解するのが難しいと感じました。また、私はボタンのonClickListenerからイベントをどのように放出するのか分かりません。新しいイベントを出すのではなく、新しいObserverを作成すると思います。RxJavaを使用してボタンのタップによって生成されるイベントの割合を減らすにはどうすればよいですか?

答えて

1

これを実現する最も簡単な方法は、イベントを抑制することです。 throttleFirst operatorを使用することができます。基本的に1つのイベントだけがトリガされるウィンドウを定義します。

あなたがRxBinding libraryを使用する場合は、あなたのクリックからのストリームを作成することができ、あなたのようなものかもしれない:あなたが他のクリックは何もしません600ミリ秒間、自分のボタンをクリックした後、そう

RxView.clicks(button).throttleFirst(600, TimeUnit.MILLISECONDS) 
    .subscribe(empty -> { // your action}); 

を、ダブルアクションを防ぐことができます。

EDIT

Observable<View> clickEventObservable = Observable.create(new Observable.OnSubscribe<View>() { 
     @Override 
     public void call(final Subscriber<? super View> subscriber) { 
      mButton.setOnClickListener(v -> { 
       if (subscriber.isUnsubscribed()) return; 
       subscriber.onNext(v); 
      }); 
     } 
    }); 

を:あなたはRxBindingを使用できない場合は、この方法では、独自のObservableを作成することができます(この実装はRxJava 1のためですが、あなたはそれを避ける必要がありますRxJavaでObservableを作成する場合はcreateを使用しないでください。1)ただし、createを使用するとRxJava 2を使用できます。

+0

これは完璧でシンプルで効率的です。私にとって唯一の問題は、RxBindingがAPI 17+であり、残念ながらAPI14をサポートする必要があることです:/ –

+1

@HumbleStudent私の回答を編集しました – GVillani82

+1

RxView.click()の実装](https://github.com/JakeWharton/RxBinding/blob/master/rxbinding/src/main/java/com/jakewharton/rxbinding2/view/ViewClickObservable.java): – GVillani82

0

RxJavaを使用する必要はありません。インスタンス変数をインジケータとして使用するだけで、以前のクリックに対してアクションが進行中かどうかを確認できます。

+0

これは私がこれまで行ってきたことですが、反応的なアーキテクチャに移行しており、よりシンプルなコードを読みたいので、Rxが最良の方法です。申し訳ありませんが、質問で明示しないと、 –

1

私はdebounce()の組み合わせを使用して、ユーザーが入力を終了した後にのみ起動します。その後、first()イベントを受け取り、repeat()で定期購読してください。最後の2つは、クリックイベントが別のイベントが観察される前に処理されたことを保証します。

RxView.clicks(button) 
     .debounce(300, TimeUnit.MILLISECONDS) 
     .first() 
     .repeat() 
     .subscribe(); 

は、あなただけの完成はもうあなたを退会しませんので、多分代わりrepeatWhen()を使用して、自分でこのObservableから退会の世話をする必要があります。

+0

RxBindingでこれを再現することができませんでした。なぜなら '' 'first()' 'は引数を必要とし、何を渡すべきか分からなかったからです。 –

+1

これはRx2に特有のものです。 'firstElement()'が代わりに使用されます。 – tynn

+0

どうもありがとうございます! –

関連する問題