2016-07-18 7 views
2

RetrofitでAPIを呼び出すためにRxを使用しています。ある時点で私はAPIを呼び出し、レスポンス1を待ってからメタデータを抽出し、レスポンス2を待ってAPIを再度呼び出す必要があります。レスポンス2を受け取った後、私はObservableを発行することができます。私の問題は、どのようにするかわからない: 2を呼び出して、応答2を出した後でのみ発信するEmit 2番目のObservableが受信された後にのみ観測可能

ここは、Observableモデルを出すべきクラスの私の関数です。メソッドget2は、外界では可視である必要はありません。代わりにmap使用flatMap

public Observable<Model> get1(String slug) { 
    return api1 
      .getInfo(slug) 
      .subscribeOn(Schedulers.io()) 
      .map(resonse1 -> { 
       String metadata = response1.getMetadata(); 

       //Make call2 with metadata 
       //call(2) 

       Model model = response1.getModel(); 
       model.setInfo(/*Info from call2*/) 

       return model; 
      }) 
      .observeOn(AndroidSchedulers.mainThread()); 
} 


private Observable<Info> get2(String metadata) { 
    return api2.getInfo(new InfoAsset(metadata)) 
      .subscribeOn(Schedulers.io()) 
      .map(response2 -> { 
       return response2.getInfo; 
      }) 
      .observeOn(AndroidSchedulers.mainThread()); 
} 

答えて

2

.flatMap(response1 -> { 
      String metadata = response1.getMetadata(); 
      return get2(metadata) 
       .map(info -> { 
        Model model = response1.getModel(); 
        model.setInfo(info); 
        return model; 
        }); 
     }) 
... 

あなたがスレッド間で変更可能なオブジェクトを使用しているので、あなたは、視認性の問題が発生することがありますので、しかし注意してください。変更不能なオブジェクトの使用を検討するか、変更が同期されることを確認してください。

1

使用ネストされたflatMaps、そしてあなたがホッピングスレッドをしたい場合を除きobserveOn使用しないでください。

private Observable<Info> get2(String metadata) { 
    return api2.getInfo(new InfoAsset(metadata)) 
     .subscribeOn(Schedulers.io()) 
     .map(response2 -> { 
      return response2.getInfo; 
     }); 
     // no ObserveOn here. 
} 

public Observable<Model> get1(String slug) { 
    return api1 
     .getInfo(slug) 
     .subscribeOn(Schedulers.io()) 
     .flatMap (response1 -> { 
      Model model = response1.getModel(); 
      return get2(response1.getMetadata()) 
        .map(response2 -> { 
         model.setInfo(response2); 
         return model; 
        }); 
     ); 
    }); 
} 
関連する問題