我有一个 searchBar (an EditText
),它下面有四个选项卡(每个选项卡应该显示不同的结果)。我使用带有 RxBinding 的 RxJava 来侦听文本更改事件并做出反应,并且我使用 switchMap() 运算符为每个文本更改发射执行改造服务。
由于用户可以选择四个选项卡中的任何一个,因此我实际上执行了对该选项卡的相应Retrofit
请求。对于这些Retrofit
服务中的每一个,我都会收到一个不同的响应对象。
我如何处理内部不同的返回类型,switchMap()
因为最后一个需要一个通用类型?
我之前已经问过一个类似的问题,但它工作时的答案不允许我使用订阅者的数据。还是我的方法从一开始就错了,我应该尝试不同的方法?
代码 :
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 的返回类型,但这不起作用我只是添加了它,所以您会看到我在做什么。