列表中每个项目的RxJava都会在Android中使用Retofit进行api请求

时间:2017-07-17 08:46:49

标签: android rx-java rx-java2

我的Android项目中存在以下问题:

我有一个使用Retrofit从以前的网络调用获得的元素列表(ArrayList)。 CategoryItem看起来像这样:

==

实际上,类别由20个元素组成。现在我需要制作网络API并获取每个类别的产品列表。为此,产品API将类别中的id作为查询参数。在我获得某个类别的产品列表后,我将其添加到内部SQLite DB中。

我想用RxJava(1和2)来做这件事。

到目前为止,我所做的并不是多线程的,并且在MainThread上是不正确的。 我将在此处添加代码段:

===

我想用flatMap或flatMapIterable做这个,最后使用多线程。

1 个答案:

答案 0 :(得分:5)

RxJava具有等效的for循环:

Observable.from(...) //RxJava1

Observable.fromIterable(...) //RxJava2

应用它可以让你迭代CategoryItem列表。 然后,每个categoryItem.getId()必须与getProductsRx() API调用的结果配对。然后使用toList()将所有结果合并到单个列表中。这看起来像这样:

RxJava1:

Observable.from(categoryItems)
    .flatMap(new Func1<CategoryItem, Observable<Pair<String, ProductResponse>>>() {
        @Override
        public Observable<Pair<String, ProductResponse>> call(@NonNull CategoryItem categoryItem) throws Exception {
            return Observable.zip(
                    Observable.just(categoryItem. getId()),
                    networkManager.getApiServiceProductsRx().getProductsRx(categoryItem. getId()),
                    new Func2<String, ProductResponse, Pair<String, ProductResponse>>() {
                        @Override
                        public Pair<String, ProductResponse> call(@NonNull String id, ProductResponse productResponse) throws Exception {
                            return new Pair<String, ProductResponse>(id, productResponse);
                        }
                    });
        }
    })
   .toList()
   .subscribeOn(Schedulers.io())
   .observeOn(AndroidSchedulers.mainThread())

RxJava2:

Observable.fromIterable(categoryItems)
    .flatMap(new Function<CategoryItem, ObservableSource<Pair<String, ProductResponse>>>() {
        @Override
        public ObservableSource<Pair<String, ProductResponse>> apply(@NonNull CategoryItem categoryItem) throws Exception {
            return Observable.zip(
                    Observable.just(categoryItem. getId()),
                    networkManager.getApiServiceProductsRx().getProductsRx(categoryItem. getId()),
                    new BiFunction<String, ProductResponse, Pair<String, ProductResponse>>() {
                        @Override
                        public Pair<String, ProductResponse> apply(@NonNull String id, @NonNull ProductResponse productResponse) throws Exception {
                            return new Pair<String, ProductResponse>(id, productResponse);
                        }
                    });
        }
    })
   .toList()
   .subscribeOn(Schedulers.io())
   .observeOn(AndroidSchedulers.mainThread())

用RxJava2编写。

以上只是Observable s。您仍然可以使用Subscriber并将数据保存到onNext()中的数据库。但是,您也可以在doOnNext()之后使用toList()运算符将数据保存到数据库中。