我使用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>>
,因为我从每个请求中收到了不同的对象。
我应该如何处理这种情况?
答案 0 :(得分:3)
一种方法是使用中间Completable
转换来丢弃所有元素,然后等待onComplete
调用。
对于每个项目,添加.toCompletable().<Void>toObservable()
以将输出转换为Observable<Void>
而不是Observable<List<String>>
。这是有效的,因为可完成确保没有元素被发射,确保类型安全。
可能有效的另一个选项是将输出声明为Observable<?>
,但这些通配符可能会导致一些奇怪的泛型问题。
请注意,如果您使用的是RxJava 2,那么忽略元素的调用只返回.ignoreElements().<Void>toObservable()