Observable <T>から1つのジェネリック型のみが受け入れられるため、Observableから複数のデータ型を取得する方法

LuongPham

Observableがジェネリック型として持つことができる引数は1つだけであることはすでに知っています。Observable私は2つのデータ型を返す2つのネットワーク呼び出しがあると仮定します:UserResponseWorkResponseそして、これらのAPIを2つずつ、getUser、getWorkの順に呼び出したいと思います。最後に、それらをサブスクライブして、データ型を1つだけ取得しましWorkResponseた。これは、getWorkが上位ストリームの最後のAPI呼び出しであるためですObservable<WorkResponse>しかし、コードブロックを購読するには、私は両方を取得したいUserResponseWorkResponseでは、どうすればそれを達成できますか?

1 -一部の人々は、私は両方を含むようにコンテナクラスを作成する必要があることを言うUserResponseWorkResponse、私は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]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ