在switchMap运算符中处理不同的返回类型

时间:2016-12-24 22:30:55

标签: android rx-java

我使用RxBinding我有一个案例,我使用RxTextView' s textChangeEvents()我过滤它们并将它们传递给我执行的switchMap()基于另一个值的网络请求(使用Retrofit)到端点。

tl;博士:

switchMap(new Func1<TextViewTextChangeEvent, Observable<List<String>>>() {
                @Override
                public Observable<List<String>> call(TextViewTextChangeEvent textViewTextChangeEvent) {

                    switch (visibleTab) {
                        case TAGS:
                            return 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));
                    }

                }
            })

但我无法作为返回类型:Observable<List<String>>,因为我从每个请求中收到了不同的对象。

我应该如何处理这种情况?

1 个答案:

答案 0 :(得分:3)

一种方法是使用中间Completable转换来丢弃所有元素,然后等待onComplete调用。

对于每个项目,添加.toCompletable().<Void>toObservable()以将输出转换为Observable<Void>而不是Observable<List<String>>。这是有效的,因为可完成确保没有元素被发射,确保类型安全。

可能有效的另一个选项是将输出声明为Observable<?>,但这些通配符可能会导致一些奇怪的泛型问题。

请注意,如果您使用的是RxJava 2,那么忽略元素的调用只返回.ignoreElements().<Void>toObservable()