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));
  1. loads items for list view from rest api
  2. loads ids of those items, which are stored as favorite in db
  3. merges both lists, so items, which are favorite, are have isFavorite >set to true
  4. 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(),尽管可能有更好的方法。