【问题标题】:Retrofit2+RxAndroid execute many requests in a loopRetrofit2+RxAndroid 循环执行多个请求
【发布时间】:2018-05-03 16:23:02
【问题描述】:

我使用 RxAndroid 库 + Retrofit2。

我有 2 个发帖请求:

  1. 获取所有类别(返回列表 == 每个字符串都是类别 id)
  2. 按类别获取产品(返回列表)

我需要在启动应用程序后加载所有产品并保存到数据库。

当我创建 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...
            }

或者可能有一些 Observable 合并 ....

我不知道。一般来说,如何做到这一点?对服务器的两个请求。一个将返回 id 列表和这些 id 上的第二个产品。

【问题讨论】:

    标签: android retrofit2 rx-android


    【解决方案1】:

    您可以通过在 rxjava 中使用 flaMap 来实现 这是一个示例演示 sn-p 如何实现它

    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
    
                 }
            });
    

    【讨论】:

    • 另外:还可以使用flatMapList&lt;T&gt;转换成Observable&lt;T&gt;
    • 他有一个之前调用的列表,需要用该列表中的每个元素再次调用 api,不能这样做;
    【解决方案2】:

    您可以使用Iterable,使用CategoryItem 调用api,然后使用toList() 以获得ProductsByCategory 的列表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-04-14
      • 1970-01-01
      • 2017-05-09
      • 1970-01-01
      • 1970-01-01
      • 2018-04-11
      • 1970-01-01
      相关资源
      最近更新 更多