RxJava оператор Debounce не работает

Я хочу реализовать автозаполнение места в приложении Android, и для этого я использую Retrofit и RxJava. Я хочу делать ответ каждые 2 секунды после того, как пользователь что-то введет. Я пытаюсь использовать оператор debounce для этого, но он не работает. Это дает мне результат немедленно, без всякой паузы.

 mAutocompleteSearchApi.get(input, "(cities)", API_KEY)
            .debounce(2, TimeUnit.SECONDS)
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .flatMap(prediction -> Observable.fromIterable(prediction.getPredictions()))
            .subscribe(prediction -> {
                Log.e(TAG, "rxAutocomplete : " + prediction.getStructuredFormatting().getMainText());
            });

1 ответ

Решение

Как говорит @BenP в комментарии, вы, кажется, подаете заявку debounce на сервис автозаполнения Place. Этот вызов возвращает Observable, который испускает один результат (или ошибку) перед завершением, после чего debounce Оператор выдаст этот единственный элемент.

То, что вы, вероятно, хотите сделать, это отменить ввод пользователя чем-то вроде:

// Subject holding the most recent user input
BehaviorSubject<String> userInputSubject = BehaviorSubject.create();

// Handler that is notified when the user changes input
public void onTextChanged(String text) {
    userInputSubject.onNext(text);
}

// Subscription to monitor changes to user input, calling API at most every
// two seconds. (Remember to unsubscribe this subscription!)
userInputSubject
    .debounce(2, TimeUnit.SECONDS)
    .flatMap(input -> mAutocompleteSearchApi.get(input, "(cities)", API_KEY))
    .flatMap(prediction -> Observable.fromIterable(prediction.getPredictions()))
    .subscribe(prediction -> {
        Log.e(TAG, "rxAutocomplete : " + prediction.getStructuredFormatting().getMainText());
    });
Другие вопросы по тегам