【发布时间】:2020-07-26 18:28:00
【问题描述】:
我有两个api请求
// 获取特定类别内的所有产品列表
1. getCategoryProducts : Observable<List<CategoryProductsModel>
class CategoryProductsModel {
int categoryId ;
String sku ;
// sku is variable I used it to get the details for each product (name , images , colors , sizes , price ..etc
}
//根据第一个api getCategoryProducts按sku获取产品详情
2.getProductDetails(var sku:String): Observable<ProductDetailsModel>
class ProductDetailsModel {
float price ;
List<Images> images ,
List<Colors> colors ,
etc ...
}
第一个请求是getCategoryProducts 然后getProductDetails 基于第一个请求获取每个产品的sku 并将其传递给getProductDetails
在我提出第二个请求后,我想在ProductModel 中添加数据响应,最终获得ProductModel 的列表以将其传递给recycler view
ProductModel
{
CategoryProductsModel mCategoryProductsModel ;
ProductDetailsModel mProductDetailsModel ;
}
我使用 RxJava 请求 API。我该怎么做?
public void getProductsList() {
getCategoryProductsObservable()
.subscribeOn(Schedulers.io())
.flatMap(new Function<CategoryProductsModel, ObservableSource<List<ProductModel>>>() {
@Override
public ObservableSource<List<ProductModel>> apply(CategoryProductsModel mCategoryProductsModel) throws Exception {
return getProductDetails(mCategoryProductsModel);
}
}).observeOn(AndroidSchedulers.mainThread())
.subscribe(this::fillProducts);
}
public Observable<CategoryProductsModel> getCategoryProductsObservable() {
return Repository.Companion.getStoreInstance().getCategoryProducts(categoryId).subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.flatMap(new Function<List<CategoryProductsModel>, ObservableSource<CategoryProductsModel>>() {
@Override
public ObservableSource<CategoryProductsModel> apply(List<CategoryProductsModel> mCategoryProductsList) throws Exception {
return Observable.fromIterable(mCategoryProductsList).subscribeOn(Schedulers.io());
}
}).subscribeOn(Schedulers.io());
}
@SuppressLint("CheckResult")
public Observable<List<ProductModel>> getProductDetails(CategoryProductsModel mCategoryProducts) {
List<ProductModel> mList = new ArrayList<>() ;
return Repository.Companion.getStoreInstance().getProductDetails(mCategoryProducts.getSku())
.map(new Function<ProductDetailsModel, List<ProductModel>>() {
@Override
public List<ProductModel> apply(ProductDetailsModel mProductDetailsModel) throws Exception {
Log.d("mProductDetailsModel", mProductDetailsModel.getName());
ProductModel productModel = new ProductModel() ;
productModel.setProductDetailsModel(mProductDetailsModel);
productModel.setCategoryProductsModel(mCategoryProducts);
mList.add(productModel);
return mList;
}
}).subscribeOn(Schedulers.io());
【问题讨论】:
标签: android api retrofit rx-java flatmap