Retrofit2 + RxAndroid在循环中执行许多请求

时间:2017-11-20 12:36:04

标签: android retrofit2 rx-android

我使用RxAndroid库+ Retrofit2。

我有2个帖子请求:

  1. 获取所有类别(返回列表==每个字符串是类别ID)
  2. 获取ProductsByCategory(返回列表)
  3. 我需要加载所有产品并在启动App后保存到数据库。

    当我创建MainFragment时,我得到所有类别:

    restApiFactory.getProductService().getCategories(new CategoryRequest(initiatorId))
                    .subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe(new CategoriesHandler());
    

    和处理回复:

    @Override
        public void onNext(CategoryResponse value) {
            List<CategoryItem> categoryItems = value.getCategoryItems();
            ...
        }
    

    然后我需要发送另一个请求(ProductsByCategory),但我不明白它是怎么做的?

    我可以用foreach发送它:

    for (CategoryItem categoryItem : categoryItems) {
                 Observable<Products> product =  ProductsByCategory...
                }
    

    或maby有一些Observable合并....

    我不知道。一般来说,怎么做?两个请求到服务器。一个将返回id和第二个产品的列表。

2 个答案:

答案 0 :(得分:0)

您可以通过在rxjava中使用flaMap来实现此目的 这是示例摘要如何实现它

api.serviceA()
        .flatMap(new Func1<FooA, Observable<FooB>>() {
            @Override
            public Observable<FooB> call(FooA fooA) {
                // code to save data from service A to db

                // call service B
                return api.serviceB();
            }
         })
         .subscribeOn(Schedulers.io())
         .observeOn(AndroidSchedulers.mainThread())
         .subscribe(new Subscriber<FooB>() {
             @Override
             public void onCompleted() {
             }

             @Override
             public void onError(Throwable e) {

             }

             @Override
             public void onNext(FooB fooB) {
                 // code to save data from service B to db

             }
        });

答案 1 :(得分:0)

您可以使用array[0]="3 45 60" array[1]="10 62 12" array[2]="5 72 12 67 89" ,使用case=test case 1 input=3 45 60 output=Enter the age: Meenu got 27 coins case=test case 2 input=10 62 12 output=Enter the age: Meenu got 1000 coins case=test case 3 input=5 72 12 67 89 output=Enter the age: Meenu got 125 coins 致电api,然后使用Iterable获取CategoryItem的列表。