2017-01-31 66 views
-1

我有每个api调用中作为post请求正文发送的对象列表。所有的帖子请求应该并行运行。对于每个请求,它应该通知它是成功还是失败,并且一旦所有发布请求完成,它都应该通知。如何使用rxjava实现此目的使用RxJava的多个android api调用

请仔细阅读此代码。这是实施吗?

FlashSaleRetrofitService retrofitService = flashSaleProvider.createRetrofitService(); 
    FlashSale runningFlashSale = JumkeyApplication.getRunningFlashSale(); 

    List<Observable<Response<ClaimWrapper>>> wrapperResponseList = new ArrayList<>(); 

    for (final CartProduct cartProduct : cartProducts) { 

     final Claim claim = new Claim(); 

     Customer customer = customerDataProvider.getCustomer(); 
     claim.setCustomerId(String.valueOf(customer.getId())); 
     claim.setEmail(customer.getEmail()); 
     claim.setMobileNumber(customer.getDefaultAddress().getPhone()); 
     claim.setProductId(Long.parseLong(cartProduct.getProductId())); 
     claim.setVariantId(Long.parseLong(cartProduct.getVariantId())); 
     claim.setQuantity(cartProduct.getQuantity()); 
     claim.setSaleId(runningFlashSale.getSaleId()); 

     wrapperResponseList.add(retrofitService.claimProduct(claim)); 
    } 

    Observable.zip(wrapperResponseList, new FuncN<List<Claim>>() { 
     @Override 
     public List<Claim> call(Object... args) { 
      return null; 
     } 
    }).subscribeOn(Schedulers.newThread()) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .doOnNext(new Action1<List<Claim>>() { 
       @Override 
       public void call(List<Claim> claims) { 

       } 
      }) 
      .compose(new Observable.Transformer<List<Claim>, Claim>() { 
       @Override 
       public Observable<Claim> call(Observable<List<Claim>> listObservable) { 
        return null; 
       } 
      }) 
      .subscribe(new Observer<Claim>() { 
       @Override 
       public void onCompleted() { 

       } 

       @Override 
       public void onError(Throwable e) { 

       } 

       @Override 
       public void onNext(Claim claim) { 

       } 
      }); 

如果这不是正确的方法,请建议我如何解决上述问题。

回答

1

您在寻找Zip方法。

查看RxJava documentation

+0

谢谢你,我会考虑的文档 –

0

如果您希望在全部完成时获得处理结果。

Observable 
     .zip(observables, new FuncN<List<Response<ClaimWrapper>>>() { 
      @Override 
      public List<String> call(Object... args) { 
       List<Response<ClaimWrapper>> result = new ArrayList<>(args.length); 

       for (Object arg : args) { 
        result.add((Response<ClaimWrapper>) arg); 
       } 
       return result; 
      } 
     }) 
     .subscribe(new Subscriber<List<Response<ClaimWrapper>>>() { 
      @Override 
      public void onCompleted() { 

      } 

      @Override 
      public void onError(Throwable e) { 

      } 

      @Override 
      public void onNext(List<Response<ClaimWrapper>> results) { 

      } 
     }); 

如果您想通过一个处理一个,当每次

Observable 
     .merge(observables) 
     .subscribe(new Subscriber<Response<ClaimWrapper>>() { 
      @Override 
      public void onCompleted() { 

      } 

      @Override 
      public void onError(Throwable e) { 

      } 

      @Override 
      public void onNext(Response<ClaimWrapper> result) { 

      } 
     }); 
+0

感谢您的帮助。与此相关的一个问题是,如果一个请求失败,剩下的请求没有执行。即使之前的请求失败,如何使它们执行。 –

+0

我很努力,但没有得到预期的结果。请任何人都帮我解决这个问题。 –

+0

onError可能只被调用一次。所以每个组合可观察到的错误都会打破所有链条。如果发生错误,接收其他请求的唯一方法是使用onErrorResumeNext()或onErrorReturn()挂起错误。 –