Замедление выброса наблюдаемого из RxTextView.textChanges - PullRequest
0 голосов
/ 26 апреля 2018

Я пытался реализовать эту функцию, где мне нужно искать каждое ключевое слово, которое вводит пользователь, но у меня есть ограничение, которое позволяет мне попасть на сервер только через 1 секунду после предыдущего вызова. Так что, если я печатаю a, b, c, d удар должен работать так --- 1 секундный интервал --- аб --- 1 секундный интервал --- азбука --- 1 секундный интервал --- ABCD

Я пытался использовать debounce, delay (вызвал исключение Looper). Может кто-нибудь сказать мне, как я могу добиться этого с помощью RxJava (Android).

public Observable<String> userTypings() {
    return RxTextView.textChanges(inputText).skip(1).flatMap(new Func1<CharSequence, Observable<String>>() {
        @Override
        public Observable<String> call(CharSequence charSequence) {
            return Observable.just(charSequence.toString());
        }
    });
}

Так происходит передача событий в представлении шаблона MVP. Прокомментируйте, если вам нужно что-нибудь еще!

1 Ответ

0 голосов
/ 27 апреля 2018

Есть несколько подходов к этому, один из которых использует publish() и сочетание sample и debounce, чтобы получить правильное время.

Другой способ - ObservableConflate: эта наблюдаемая была разработана для решения именно этой проблемы.

keyboardInputObservable
  .compose(f -> Observable.create(new ObservableConflate<Integer>(f, 1, TimeUnit.SECONDS, scheduler) ) )
  .doOnNext( input -> lookup(input) )
  ...

Оператор ограничит скорость запросов lookup до одного в секунду.

Примечание: используемый оператор create(), возможно, должен быть unsafeCreate() в некоторых версиях библиотеки.

Вы можете поблагодарить @akarnokd за решение.

...