У меня есть searchBar (EditText
) с четырьмя вкладками под ним (каждая вкладка должна показывать разные результаты). Я использую RxJava с RxBinding для прослушивания и реагирования на события с изменениями текста, и я использую оператор switchMap() для выполнения службы Retrofit для каждого изменения изменения текста.Как выполнить различные запросы на переоснащение внутри оператора switchMap() RxJava?
Поскольку пользователь может выбрать любую из четырех вкладок, я фактически выполняю соответствующий запрос Retrofit
для этой вкладки. Для каждого из этих Retrofit
услуг я получаю другой объект ответа.
Как я могу обрабатывать разные типы возврата внутри switchMap()
, так как последний нужен общий тип для всех?
Я уже задал аналогичный question, но ответ во время его работы не позволяет мне использовать данные у моего подписчика. Или мой подход неправильный с самого начала, и я должен попробовать другой подход?
Код:
RxTextView.textChangeEvents(searchbar.getEditText())
.debounce(400, TimeUnit.MILLISECONDS)
.filter(new Func1<TextViewTextChangeEvent, Boolean>() {
@Override
public Boolean call(TextViewTextChangeEvent text) {
return (text.text().length() > 2);
}
})
.subscribeOn(AndroidSchedulers.mainThread())
.observeOn(Schedulers.io())
.switchMap(new Func1<TextViewTextChangeEvent, Observable<Void>>() {
@Override
public Observable<Void> call(TextViewTextChangeEvent textViewTextChangeEvent) {
String searchBarText = textViewTextChangeEvent.text().toString();
switch (visibleTab) {
case TAGS:
presenter.executeSearchPostsByTag(searchBarText, String.valueOf(0));
case PEOPLE:
return presenter.executeSearchPostsByPeople(searchBarText, String.valueOf(0));
case COMPANIES:
return presenter.executeSearchPostsByCompanies(searchBarText, String.valueOf(0));
case JOBS:
return presenter.executeSearchPostsByJobs(searchBarText, String.valueOf(0));
default:
return presenter.executeSearchPostsByTag(searchBarText, String.valueOf(0));
}
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<Void>() {
@Override
public void onCompleted() {
Timber.i("ON COMPLETED");
}
@Override
public void onError(Throwable e) {
Timber.i("ON ERROR e : %s", e.getMessage());
}
@Override
public void onNext(Void aVoid) {
Timber.i("ON NEXT");
}
});
В коде выше вы увидите, что у меня есть тип возвращаемого Observable, но это не работает, я просто добавил это так, вы увидите, что я делаю.