Android 如何在RxJava的switchMap()操作符中执行不同的改装请求?

Android 如何在RxJava的switchMap()操作符中执行不同的改装请求?,android,rx-java,rx-binding,Android,Rx Java,Rx Binding,我有一个搜索栏和一个编辑文本,下面有四个选项卡,每个选项卡应该显示不同的结果。我使用RxJava和RxBinding来监听和响应文本更改事件,并使用switchMap操作符为每个文本更改执行一个改进服务 因为用户可以选择四个选项卡中的任何一个,所以我实际上会为该选项卡执行相应的改装请求。 对于每一项改装服务,我都会收到不同的响应对象 既然最后一个返回类型需要一个通用类型,我如何在switchMap中处理不同的返回类型 我以前也问过类似的问题,但问题的答案是,虽然有效,但我无法使用订阅者提供的数据

我有一个搜索栏和一个编辑文本,下面有四个选项卡,每个选项卡应该显示不同的结果。我使用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

如果您需要对返回的任何内容进行处理,那么您应该在不同的方法中,在它们自己的可观察链中进行处理

如果您需要执行一些对它们都通用的处理,那么您需要调整您的模型以反映这一点,即使它只是包装类