Я новичок в RxJava, и есть много примеров и ответов, но у меня возникают проблемы с соединением чего-то, что решает все мои проблемы.
Код ниже, кажется,за исключением того, что я иногда получаю результаты не в порядке.Поэтому я думаю, что мне нужно ввести switchMap, но я точно не знаю, где именно, и мне интересно, если я еще не сделал ненужные сложности, например, странно ли подписываться на RxBinding и отдельно подписываться на сетевой вызов?
view.autocompleteText () является RxBinding.Я хочу получить от этого текст, позвонить в сервис модернизации и обновить представление с результатами, со всеми наворотами, такими как показ / скрытие счетчика, и обработкой ошибок для сетевого вызова, которая не убьет все это и не сделает мойтекстовое поле не отвечает.
private void handleAutocompleteText() {
mCompositeDisposable.add(view.autocompleteText()
.debounce(400, TimeUnit.MILLISECONDS)
.filter(s -> s.length() >= resources.getAutocompleteThreshold())
.observeOn(threads.main())
.doOnNext(s -> view.setProgressVisible(true))
.subscribe(s -> {
mCompositeDisposable.add(mAutocompleteService.query(s.toString())
.subscribeOn(threads.io())
.observeOn(threads.main()).toObservable()
.retry(3)
.doOnNext(response -> {
if (response.getStatus() != 200)
throw new RuntimeException("Server error " + response.getStatus());
})
.map(response -> response.getData())
.subscribe(items -> {
view.setProgressVisible(false);
view.updateList(items);
}, error -> {
view.setProgressVisible(false);
view.showMessage(resources.getListError());
}));
}, error -> {
view.setProgressVisible(false);
view.showMessage(resources.getListError());
}
)
);
}
Есть ли лучший способ сделать это, и где я могу ввести switchMap, чтобы отменить любые поиски в полете и обновить только представление с результатами последнего?И если ответ будет кардинально другим, я буду очень признателен за прохождение.
Заранее спасибо !!