QAチームによって実行されるテストの1つは、いくつかのボタンを熱心にタップして、1つのイベントだけが実行されることを確認することです。この動作を保証するためにRxJavaを使用することは可能ですか?私はRxJavaからthis backpressure pageを読むことを試みましたが、私はそれを本当に理解するのが難しいと感じました。また、私はボタンのonClickListenerからイベントをどのように放出するのか分かりません。新しいイベントを出すのではなく、新しいObserverを作成すると思います。RxJavaを使用してボタンのタップによって生成されるイベントの割合を減らすにはどうすればよいですか?
答えて
これを実現する最も簡単な方法は、イベントを抑制することです。 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を使用できます。
RxJavaを使用する必要はありません。インスタンス変数をインジケータとして使用するだけで、以前のクリックに対してアクションが進行中かどうかを確認できます。
これは私がこれまで行ってきたことですが、反応的なアーキテクチャに移行しており、よりシンプルなコードを読みたいので、Rxが最良の方法です。申し訳ありませんが、質問で明示しないと、 –
私はdebounce()
の組み合わせを使用して、ユーザーが入力を終了した後にのみ起動します。その後、first()
イベントを受け取り、repeat()
で定期購読してください。最後の2つは、クリックイベントが別のイベントが観察される前に処理されたことを保証します。
RxView.clicks(button)
.debounce(300, TimeUnit.MILLISECONDS)
.first()
.repeat()
.subscribe();
は、あなただけの完成はもうあなたを退会しませんので、多分代わりrepeatWhen()
を使用して、自分でこのObservable
から退会の世話をする必要があります。
RxBindingでこれを再現することができませんでした。なぜなら '' 'first()' 'は引数を必要とし、何を渡すべきか分からなかったからです。 –
これはRx2に特有のものです。 'firstElement()'が代わりに使用されます。 – tynn
どうもありがとうございます! –
- 1. 地図をタップ&ホールドしてイベントを作成するにはどうすればよいですか?
- 2. コマンドパターンを使用してメニューの複雑さを減らすにはどうすればよいですか?
- 3. jQueryを使用してボタンにパスを割り当てるにはどうすればよいですか?
- 4. IOS - バックグラウンドのボタンがタップされないようにするにはどうすればいいですか?
- 5. Moqを使用してイベントを発生させるにはどうすればよいですか?
- 6. ボタンを使用してさらに投稿を表示するにはどうすればよいですか?
- 7. broを使用してpcapファイルからsoftware.logを生成するにはどうすればよいですか?
- 8. matplotlibを使用して値リストからヒストグラムを生成するにはどうすればよいですか?
- 9. このコードで使用される変数を減らすにはどうすればよいですか?
- 10. RubyとPumaを使用して他のリクエストによって生成されたリクエストを検出するにはどうすればよいですか?
- 11. クリックイベントによってボタンを使用してFirebaseからフェッチされた投稿を削除するにはどうすればよいですか?
- 12. sendgrid mail apiを使用してdompdfによって生成されたpdfをメールに添付するにはどうすればよいですか?
- 13. Hibernateによって生成されたユニークなフィールドを扱うにはどうすればいいですか?
- 14. AndroidのHandler.PostDelayedを使用して、指定された時刻にイベントが発生するようにするにはどうすればよいですか?
- 15. バックボーンフェッチによって生成されたエラーを見つけるにはどうすればいいですか
- 16. WinAPIを使用して「はい」ボタンを作成するにはどうすればよいですか?
- 17. Twythonを使用している人のリストを生成するにはどうすればよいですか?
- 18. Visual Studioを使用してリモートデバッグ用のシンボルファイルを生成するにはどうすればよいですか?
- 19. Yoctoを使用してWindows用のツールチェーンを生成するにはどうすればよいですか?
- 20. 「再生」ボタンを作成するにはどうすればよいですか?
- 21. 文字列の順列を生成するランタイムを減らすにはどうすればよいですか?
- 22. PhoneGap/Cordovaを使用して作成されたAndroidアプリのボタンをクリックして音声を再生するにはどうすればよいですか?
- 23. CSSを使用してボタンの中心を合わせるにはどうすればよいですか?
- 24. RxJava 2を使用して再試行でレースをオーケストレーションするにはどうすればよいですか?
- 25. ボタンを作成するにはどうすればいいですか?どのようにイベントを割り当てますか?
- 26. angularjsを使用して冗長コードを減らすにはどうすればよいですか?
- 27. nginx serving webmを使用してContent-Rangeヘッダーを減らすにはどうすればよいですか?
- 28. ボタンをタップしてUIKeyboardを表示するにはどうすればよいですか?
- 29. 生成されたGridViewに別のボタンを追加するにはどうすればよいですか?
- 30. WPFでボタンを使用してTextBoxを作成するにはどうすればよいですか?
これは完璧でシンプルで効率的です。私にとって唯一の問題は、RxBindingがAPI 17+であり、残念ながらAPI14をサポートする必要があることです:/ –
@HumbleStudent私の回答を編集しました – GVillani82
RxView.click()の実装](https://github.com/JakeWharton/RxBinding/blob/master/rxbinding/src/main/java/com/jakewharton/rxbinding2/view/ViewClickObservable.java): – GVillani82