1

我有一个 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 的返回类型,但这不起作用我只是添加了它,所以您会看到我在做什么。

4

1 回答 1

1

问题是,是否有任何executeSearchPostsBy*方法返回非空 Observable?如果他们所有的 Observables 都是空的,那么你可以添加所有的 Observables .cast(Void.class)。如果他们确实返回了非空的 observables 但你不关心这些项目,那么继续.ignoreElements().cast(Void.class).

如果您需要对返回的任何内容进行一些处理,那么您应该使用不同的方法,在它们自己的 Observable 链中进行处理。

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

于 2016-12-25T22:51:33.483 回答