Android 如何在RxJava的switchMap()操作符中执行不同的改装请求?
我有一个搜索栏和一个编辑文本,下面有四个选项卡,每个选项卡应该显示不同的结果。我使用RxJava和RxBinding来监听和响应文本更改事件,并使用switchMap操作符为每个文本更改执行一个改进服务 因为用户可以选择四个选项卡中的任何一个,所以我实际上会为该选项卡执行相应的改装请求。 对于每一项改装服务,我都会收到不同的响应对象 既然最后一个返回类型需要一个通用类型,我如何在switchMap中处理不同的返回类型 我以前也问过类似的问题,但问题的答案是,虽然有效,但我无法使用订阅者提供的数据。还是我的方法一开始就错了,我应该尝试另一种方法 代码:Android 如何在RxJava的switchMap()操作符中执行不同的改装请求?,android,rx-java,rx-binding,Android,Rx Java,Rx Binding,我有一个搜索栏和一个编辑文本,下面有四个选项卡,每个选项卡应该显示不同的结果。我使用RxJava和RxBinding来监听和响应文本更改事件,并使用switchMap操作符为每个文本更改执行一个改进服务 因为用户可以选择四个选项卡中的任何一个,所以我实际上会为该选项卡执行相应的改装请求。 对于每一项改装服务,我都会收到不同的响应对象 既然最后一个返回类型需要一个通用类型,我如何在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,但这不起作用,我只是添加了它,这样你就可以看到我在做什么。问题是,是否有任何executeSearchPostsBy*方法返回非空的Observable?如果它们的所有可观察对象都是空的,那么您可以将.castVoid.class附加到所有对象上。如果它们确实返回非空的观察值,但您不关心这些项,那么就添加.ignoreElements.castVoid.class
如果您需要对返回的任何内容进行处理,那么您应该在不同的方法中,在它们自己的可观察链中进行处理
如果您需要执行一些对它们都通用的处理,那么您需要调整您的模型以反映这一点,即使它只是包装类