web-dev-qa-db-ja.com

RxJava + Retrofit-複数の呼び出しを行う

同期呼び出しと非同期呼び出しを使用する場合、Retrofitをしっかりと理解しています。ただし、いくつかの複雑なタスクを作成するときに小さな問題が発生しました。

  1. IDのリストを取得するために要求を作成します(約20-30 ID)
  2. IDのリストを取得した後、IDで定義された各オブジェクトに関する情報を取得するために、非同期呼び出しを行います。パラレルで20〜30個リクエストしたいです。非同期呼び出しからすべてのデータを受信した後、UIを更新するためにそれを観察したいと思います。

その問題について読んだところ、RxJavaで問題を解決できることに気付きました。しかし、率直に言って、これまでのところ、プロセス全体を理解するのは本当に難しいと感じました。

RxJava/RxAndroidの問題に没頭するために、いくつかの正しい例を読んでいただければ幸いです。

21
Arek Biela

この例では、IDのリストを取得し、それを個々のオブザーバブルで分割し、個々のIDに対してサービスを呼び出し、n応答ごとにgetDetails回通知されます。

service.getIds()
        .flatMap(ids -> Observable.from(ids))
        .map(id -> service.getDetails(id))
        .subscribe(detailed -> updateUi(detailed));

Observable.Zip関数をいくつかの並列呼び出しで待機しますが、可変サイズの呼び出しで使用できるかどうかはわかりません。

これを見てください

Observableのレトロフィットサポートにより、複数のREST呼び出しを一緒に結合することも簡単になります。たとえば、写真を取得する1つの呼び出しとメタデータを取得する2番目の呼び出しがあるとします。結果を一緒に圧縮できます。 :

Observable.Zip(
    service.getUserPhoto(id),
    service.getPhotoMetadata(id),
    (photo, metadata) -> createPhotoWithData(photo, metadata))
    .subscribe(photoWithData -> showPhoto(photoWithData));
13
ffleandro

あなたが本当に探しているのは、RxJavaを使い始めるための情報または例なので、Dan Lewによるこの優れた一連の記事をご覧になることをお勧めします。 http:// blog .danlew.net/2014/09/15/grokking-rxjava-part-1 /

このシリーズには、機能を実装する方法を理解するのに十分な資料が含まれている必要があります。

3
memoizr