2016-12-23 24 views
2

私はSyncServiceを持っています。オブザーバブルイベント= mDataManager.syncEvents()は、API呼び出しです。私は、並列コールやりたいRxJava - 2つのAPI呼び出しの並列実行

シングルのUserInfo = mDataManager.getUserInfoを()

とstopSelf(startId)を呼び出します。これら2つのコールが終了した後。

どうすればいいですか?

私はRxJava Fetching Observables In Parallel を試しましたが、これは少し異なる場合です。

私は.zipまたは.mergeメソッドを使用する必要があると思います。しかし、私の場合、1つのメソッド呼び出しはObservable(イベントのリスト)と2つ目のSingle(1つのUserInfoオブジェクト)を返します。

私は.zipの方法の結果である可能性がありzの結果クラスを作成しましたが、私はそれを埋めるために方法がわからない:

public class SyncResponse { 
    List<Event> events; 
    UserInfo userInfo; 
    ... 
} 

答えて

0

あなたはこれを達成するためにobservable.zipとsingle.toObservableを使用することができます。私は、並列にそれらを行うために、あなたは別々に各オブザーバのジップコール内であなたのスレッドスケジューリングを行う必要があると思います。

Observable.zip(call1.subscribeOn(Schedulers.io()), call2.toObservable().subscribeOn(Schedulers.io(), zip-function) 

両方の呼び出しが異なるラップされた型であるためです。

ジップ関数は、クラスを使用して結果を結合する場所です。

オブザーバブルの1つがシングルであるため、このメソッドは最初のonNextイベントの直後にonCompleteイベントを送信するため、ほとんどの場合1つの結果しか生成しません。

イベントのリストが完了することがわかっている場合は、to1Listを使用してそれらをバッファリングし、イベントを収集した単一のリストとして送信することができます。

0

オブザーバブルが2つしかないので、アンドロイドペアを使用してそれらを組み合わせて結果を結合することができます。

mDataManager.syncEvents() 
    .zipWith(mDataManager.getUserInfo().toObservable(), Pair::create) 
    .subscribeOn(Schedulers.io()) 
    .subscribe(pair -> { 
     Event event = pair.first; 
     UserInfo userInfo = pair.second; 

     // your code here 

     Timber.i("Synced successfully!"); 
     stopSelf(startId); 
    }, throwable -> { 
     Timber.w(e, "Error syncing."); 
     stopSelf(startId); 
    }); 

あなたが完了するまで、すべてのイベントを収集必要と単一のユーザー情報とそれらのすべてを組み合わせた場合、それは

Observable<ArrayList<String>> eventsObservable = mDataManager.syncEvents() 
    .collect(ArrayList::new, ArrayList::add); 

mDataManager.getUserInfo() 
    .zipWith(eventsObservable.toSingle(), Pair::create) 
    .subscribeOn(Schedulers.io()) 
    .subscribe(pair -> { 
     UserInfo userInfo = pair.first; 
     List<Event> event = pair.second; 

     // your code here 

     Timber.i("Synced successfully!"); 
     stopSelf(startId); 
    }, throwable -> { 
     Timber.w(e, "Error syncing."); 
     stopSelf(startId); 
    }); 
少し複雑になりjava8/retrolmbdaが、なぜ

せずに同じことを行うことができます

関連する問題