Observableがジェネリック型として持つことができる引数は1つだけであることはすでに知っています。Observable私は2つのデータ型を返す2つのネットワーク呼び出しがあると仮定します:UserResponse
とWorkResponse
。そして、これらのAPIを2つずつ、getUser、getWorkの順に呼び出したいと思います。最後に、それらをサブスクライブして、データ型を1つだけ取得しましWorkResponse
た。これは、getWorkが上位ストリームの最後のAPI呼び出しであるためですObservable<WorkResponse>
。しかし、コードブロックを購読するには、私は両方を取得したいUserResponse
とWorkResponse
。では、どうすればそれを達成できますか?
1 -一部の人々は、私は両方を含むようにコンテナクラスを作成する必要があることを言うUserResponse
とWorkResponse
、私はsubcribeコードブロックでそのコンテナからこれらのデータ型を取得することができます。
2-userResponseを保持する一時変数を作成し、次のようにsubscibeコードブロックからアクセスします。
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
var tempUserResponse: UserResponse? = null
Observable.just("Prepare call API")
.flatMap {
apiGetUser()
}.flatMap { userResponse ->
tempUserResponse = userResponse // Save temporarily userResponse to pass it to subscribe code block
apiGetWork()
}.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe { workResponse ->
Log.e("TAG", "userResponse = " + tempUserResponse)
Log.e("TAG", "workResponse = " + workResponse)
}
}
private fun apiGetUser(): Observable<UserResponse> {
// Fake API to get User
return Observable.just(UserResponse())
}
private fun apiGetWork(): Observable<Work> {
// Fake API to get Work
return Observable.just(Work())
}
class Work
class UserResponse
}
3-別の方法はありますか?答えてください、どうもありがとう!
編集:あなたのすべての答えをありがとう、みんな!すべての回答は、実装方法(を使用nested flatMap
または使用zip
)が異なる場合がありますが、必要なすべてのオブジェクトのコンテナクラスとして3番目のクラスを使用する必要があります。組み込みのコンテナクラスには、次のものがPair<A, B>
ありTriple<A, B, C>
ます。さらに引数が必要な場合は、独自の引数を作成する必要があります
zipを使用して、2つの結果から1つのオブジェクトを取得できます。
public class MergedObject{
private Work workResponse;
private UserResponse userResponse;
MergedObject(final Work workResponse, final UserResponse userResponse){
this.workResponse= workResponse;
this.userResponse= userResponse;
}
// getter / setter
}
その後
Observable.just("Prepare call API")
.flatMap {
apiGetUser()
}.zipWith(apiGetWork(), ( userResponse, workResponse ) ->
return new MergedObject(workResponse, userResponse)
).subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe { mergedObject->
Log.e("TAG", "userResponse = " + mergedObject.userResponse)
Log.e("TAG", "workResponse = " + mergedObject.workResponse)
}
(テストなしで書かれているので、少し適応する必要があるかもしれません)
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加