我的Android项目中存在以下问题:
我有一个使用Retrofit从以前的网络调用获得的元素列表(ArrayList)。 CategoryItem看起来像这样:
==
实际上,类别由20个元素组成。现在我需要制作网络API并获取每个类别的产品列表。为此,产品API将类别中的id作为查询参数。在我获得某个类别的产品列表后,我将其添加到内部SQLite DB中。
我想用RxJava(1和2)来做这件事。
到目前为止,我所做的并不是多线程的,并且在MainThread上是不正确的。 我将在此处添加代码段:
===
我想用flatMap或flatMapIterable做这个,最后使用多线程。
答案 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()
运算符将数据保存到数据库中。