Реализация мгновенного поиска c RxJava
Пытаюсь делать в своем приложении мгновенный поиск пользователей из удаленной БД с RxJava. Следуя по одной статьи получилось сделать так: Сначала мне приходится получить всех пользователей,а потом искать их из всех полученных пользователей. Мне надо, чтобы запрос поиска отправлялся прямо на сервер, и чтобы мне сервер давал результат запроса.
Когда я передаю текст поиска так publishSubject.onNext(""); , то запрос срабатывает, сервер дает мне результат. Но чтобы при каждом событии в EditText запрос отправлялся на сервер, сервер давал результат - такое у меня не получается.
При каждом событии в TextChangeEvent запрос на поиск не отправляется.
Скажите пожалуйста, должен ли сервер (api который мне дали) поддерживать получения мгновенного результата удаленного поиска? Или у меня в коде в каком-то месте ошибка. Почему не отправляется запрос на поиск?
disposable.add(publishSubject.debounce(300, TimeUnit.MILLISECONDS)
.distinctUntilChanged()
.switchMapSingle((Function<String, Single<List<UsersCoordinate>>>) s -> apiClient.getUserService().getUsersSearch("", s)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread()))
.subscribeWith(observer));
disposable.add(RxTextView.textChangeEvents(binding.etSearch)
.skipInitialValue()
.debounce(300, TimeUnit.MILLISECONDS)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribeWith(searchUsersTextWatcher()));
disposable.add(observer);
publishSubject.onNext("");
private DisposableObserver<TextViewTextChangeEvent> searchUsersTextWatcher() {
return new DisposableObserver<TextViewTextChangeEvent>() {
@Override
public void onNext(TextViewTextChangeEvent textViewTextChangeEvent) {
publishSubject.onNext(textViewTextChangeEvent.text().toString());
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
};
}
Ответы (1 шт):
Вы, кажется, как-то переусложнили код. Должно что-то такое заработать так, как вы описываете:
RxTextView.textChangeEvents(searchbar.getEditText())
.debounce(400, TimeUnit.MILLISECONDS)
.map { it.text().toString() }
.flatMap { apiClient.getUserService().getUsersSearch("", it) }
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe { ... }