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

时间:2016-12-25 14:54:31

标签: android rx-java rx-binding

我有一个searchBar(EditText),下方有四个标签(每个标签应显示不同的结果)。我使用RxJava和RxBinding来监听和响应文本更改事件,并且我使用switchMap()运算符为每个文本更改发送执行Retrofit服务。

由于用户可以选择四个选项卡中的任何一个,我实际上会对该选项卡执行相应的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,但这不起作用我只是添加了它,这样您就可以看到我正在做的事情。< / p>

1 个答案:

答案 0 :(得分:1)

事实是,任何executeSearchPostsBy*方法都会返回一个非空的Observable吗?如果他们的所有Observable都是空的,那么你可以将.cast(Void.class)添加到所有Observable中。如果他们确实返回了非空的可观察对象,但您并不关心这些项目,那么请点击.ignoreElements().cast(Void.class)

如果你需要对返回的任何东西进行一些处理,那么你应该在他们自己的Observable链中以不同的方法进行处理。

如果您需要对所有这些处理进行一些共同的处理,那么您需要调整模型以反映这一点,即使它只是包装类。