RxJava Android 压缩许多不同类型的请求
RxJava Android zip many requests with different types
我对 Observable.zip 函数有点 "estetic" 问题。你这样使用它:
Observerbale.zip(
reqA, reqB, reqC,
(a, b, c) -> {/*deal with them*/});
请求数量等于"deal-with-it"函数中的参数数量。现在,如果你有更多的请求,比如 6,你最终会得到一个函数,它有 6 个参数(假设它们都有不同的类型)。就是感觉不干净。有没有办法将它们包装在一个 class 中,例如属性?
我现在的现实问题是,我使用 zip 来加载设置数据:
Observable.zip(
loadAPIMenus(), //1.
databaseService.readFavorites(), //2.
(menuResponse, favorites) -> loadFavorites(menuResponse, favorites)) //3.
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
menus -> menuSubscriber.onNext(menus), //4.
error -> menuSubscriber.onError(error));
- loads items for list view from rest api
- loads ids of those items, which are stored as favorite in db
- merges both lists, so items, which are favorite, are have isFavorite >set to true
- Updates list view
现在还不错。但是我想在#3 处添加 2-3 个对其他数据结束函数的请求,这将增长到具有太多函数参数的 4 行庞大。
我想,我可以使用 Observable.zip 嵌套在另一个中,但可能很危险。有没有更优雅的方式来包装这些参数?
很高兴看到您的建议。
在 Observable::zip()
的文档中指出:
"You can provide the Observables to be zipped together to zip either as between two and nine individual parameters, or as a single parameter: either an Iterable of Observables or an Observable that emits Observables (as in the illustration above)."
这为使用某种形式的 Iterable<Observable<T>>
或 Observable<Observable<T>>
而不是您现在使用的 2-9 Observable
之间的任何重载打开了大门。
通过这种方法,zip
的最后一个参数现在也变成了 FuncN
,它以参数列表 Object... args
作为参数调用,您可以将其视为数组.
如果您使用 Observable::zip(Iterable, FuncN)
方法,您可以:
List<Observable<T>> list = new ArrayList<>();
list.add(req1);
list.add(req2);
Observable.zip(list, new FuncN<???>() {
@Override
public ??? call(Object... args) {
return ???;
}
);
我不会理会你的情况下的 Observable<Observable<T>>
,因为这需要你首先创建一个可观察列表或数组以传递给 Observable::from()
,尽管可能有更好的方法。
我对 Observable.zip 函数有点 "estetic" 问题。你这样使用它:
Observerbale.zip(
reqA, reqB, reqC,
(a, b, c) -> {/*deal with them*/});
请求数量等于"deal-with-it"函数中的参数数量。现在,如果你有更多的请求,比如 6,你最终会得到一个函数,它有 6 个参数(假设它们都有不同的类型)。就是感觉不干净。有没有办法将它们包装在一个 class 中,例如属性?
我现在的现实问题是,我使用 zip 来加载设置数据:
Observable.zip(
loadAPIMenus(), //1.
databaseService.readFavorites(), //2.
(menuResponse, favorites) -> loadFavorites(menuResponse, favorites)) //3.
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
menus -> menuSubscriber.onNext(menus), //4.
error -> menuSubscriber.onError(error));
- loads items for list view from rest api
- loads ids of those items, which are stored as favorite in db
- merges both lists, so items, which are favorite, are have isFavorite >set to true
- Updates list view
现在还不错。但是我想在#3 处添加 2-3 个对其他数据结束函数的请求,这将增长到具有太多函数参数的 4 行庞大。
我想,我可以使用 Observable.zip 嵌套在另一个中,但可能很危险。有没有更优雅的方式来包装这些参数?
很高兴看到您的建议。
在 Observable::zip()
的文档中指出:
"You can provide the Observables to be zipped together to zip either as between two and nine individual parameters, or as a single parameter: either an Iterable of Observables or an Observable that emits Observables (as in the illustration above)."
这为使用某种形式的 Iterable<Observable<T>>
或 Observable<Observable<T>>
而不是您现在使用的 2-9 Observable
之间的任何重载打开了大门。
通过这种方法,zip
的最后一个参数现在也变成了 FuncN
,它以参数列表 Object... args
作为参数调用,您可以将其视为数组.
如果您使用 Observable::zip(Iterable, FuncN)
方法,您可以:
List<Observable<T>> list = new ArrayList<>();
list.add(req1);
list.add(req2);
Observable.zip(list, new FuncN<???>() {
@Override
public ??? call(Object... args) {
return ???;
}
);
我不会理会你的情况下的 Observable<Observable<T>>
,因为这需要你首先创建一个可观察列表或数组以传递给 Observable::from()
,尽管可能有更好的方法。