2017-03-07 14 views
8

私が抱えている問題はこれです。私はサーバーへのリクエストをいくつか実行する必要があります。次の各リクエストは、前のリクエストの結果に依存します。彼らはこのようになり (省略):私はPaymentResponseオブジェクトを返すか、要件の一部が満たされていない場合は()のonErrorを発するflatMapを使用して、単一の観測可能を作成しましたRxJava - リクエストの更新とUIの更新

Observable<FileUploadResponse> obsFile = api.uploadFile(); 
Observable<TokenCreateResponse> obsCreateToken = api.createToken(); 
Observable<PaymentResponse> obsPayment = api.submitOrder(); 

。これは正常に動作しており、すべての要求が1回の呼び出しで完了します。

問題は、これらの要求の間でUIを更新できないことです。現在の設定では、リクエストの開始時にロードを表示し、すべてのリクエストが完了したらロードを非表示にします。これらの要求の間にUIを更新する方法はありますか?

私が望むのは です。1.ファイルアップロード - UIにメッセージを書き込みます。 2.トークンの作成 - UIにメッセージを書き込みます。 3.注文の送信 - UIにメッセージを書き込みます。 4.すべて完了したら、進行状況ダイアログを非表示にします。

各APIコールが終了したときにonNext()を使用してObservableを発行し、すべて完了したときにonComplete()を呼び出すことを理解します。しかし、私はこれをどのようにして行うのですか?

+0

処理パイプラインのどこでも 'doOnNext()'メソッドを使用して、何が起こっているのか、そして中間結果が何であるかを確認できます。もちろん、それぞれのスレッドでオブザーバとサブスクライブしてください。 – Raghunandan

+0

もう一つの可能​​性は、あなたがあなたの 'サブスクライバ 'のタイプとして使用する共通のラッパー。 flatMap(tokenCreateResponse - > Observable.concat(Observable.concat(Observable.concat(Observable.concat(Observable.concat(Observable.concat(Observable.concat(Observable.concat(Observable.concat(Observable.concat));という名前のものがあります。 StatusUpdate(tokenCreateResponse)、api.submitOrder())... ' - [RxSealedUnions](https://github.com/pakoito/RxSealedUnions)というライブラリは、このようなアプローチに役立ちます... –

答えて

8

doOnNextPublishSubjectでこれを達成できます。まず、対象といくつかの値を作成します。あなたは、アップロード作業をやっているとき

public static final int STATUS_UPLOADING = 0; 
public static final int STATUS_TOKEN = 1; 
public static final int STATUS_SUBMITTING = 2; 
public static final int STATUS_DONE = 3; 

PublishSubject<Integer> status = PublishSubject.create(); 

public Observable<Integer> getStatusStream() { 
    return status; 
} 

それからちょうど対象にするたびに値を送信します。

status.onNext(STATUS_UPLOADING); 

return api.uploadFile() 
    .doOnNext(o -> status.onNext(STATUS_TOKEN)) 
    .flatMap(o -> api.createToken()) 
    .doOnNext(o -> status.onNext(STATUS_SUBMITTING)) 
    .flatMap(o -> api.submitOrder()) 
    .doOnNext(o -> status.onNext(STATUS_DONE)) 

次にあなたがSubjectおよび更新を購読することができますあなたのUI:

model.getStatusStream() 
    .subscribeOn(AndroidSchedulers.mainThread()) 
    .subscribe(
     status -> { 
      view().setMessage(status); 
     }, 
     Throwable.printStackTrace 
    ); 

また、あなたが建築家にアプリをしたいかに応じて、あなただけのdoOnNextそれぞれからの更新ビューコールを呼び出すことができます時間。毎回メインの&スレッドを切り替えるには、observeOnを使用する必要があります。

+0

ありがとう、これはまさにです私が探していたもの –