2017-01-31 3 views
-1

私は、各api呼び出しでpost要求のために本文として送られるオブジェクトのリストを持っています。すべての投稿要求は並行して実行する必要があります。それぞれの要求に対して、成功または失敗のいずれかを通知し、すべての投稿要求が完了したら通知する必要があります。これをrxjavaを使って実現する方法RxJavaを使った複数のアンドロイド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

感謝を見るでしょう。この問題の1つの問題は、1つの要求が失敗した場合、残りの要求が実行されていないことです。以前のリクエストが失敗しても実行させる方法 –

+0

非常に頑張っていますが、期待した結果が得られません。誰でもこの問題について私に助けてください。 –

+0

onErrorは1回だけ呼び出すことができます。したがって、結合された観測可能な各エラーはすべてのチェーンを破壊する。何かが失敗した場合に他のリクエストを受け取る唯一の方法は、onErrorResumeNext()またはonErrorReturn()を使用してエラーを中断することです。 –

関連する問題