web-dev-qa-db-ja.com

RxJavaがRetrofitでよく使用されるのはなぜですか?

Rxjavaと組み合わせてRetrofitを使用する利点は何ですか?

42
Ranjith Kumar

質問

バックグラウンドスレッドで既に実行中です。では、なぜ別のバックグラウンドタスクRxJavaが必要なのでしょうか。

最も重要なのは、ネストされたコールバック(callback hell)を避けることです。

例)Callback hell(Retrofit)

public interface MyService
{
    @GET("users")
    Call<List<UserModel>> getUser();

    @GET("userinfo")
    Call<UserInfoModel> getUserInfoById(@Query("id") Integer id);
}

service.getUser().enqueue(new Callback<UserModel>() {

    @Override
    public void onResponse(Call<UserModel> call, Response<UserModel> response) {
        //process UserModel

        UserModel data = response.body();

        //if you want user infomation from server
        service.getUserInfo(data.getId()).enqueue(new Callback<UserInfoModel>(){
            //... is callback hell!!
        });

    }
    @Override
    public void onFailure(Call<UserModel> call, Throwable t) {
       //error handling
    }
});

例)コールバック地獄を回避(Retrofit + RxJava)

public interface MyService
{
    @GET("users")
    Observable<List<UserModel>> getUser();

    @GET("userinfo")
    Observable<UserInfoModel> getUserInfoById(@Query("id") Integer id);
}

service.getUser()
    .flatMapIterable(list -> list)
    .flatMap(user -> service.getUserInfoById(user.getId()))
    .doOnNext(userinfo -> saveUserInfo(userinfo)).subscribe();

RxJavaを使用している場合は、Observableを使用してこの状況を回避できます。

追加

上記のコードスニペットはほんの一例です。

実際、RxJavaには、さらに多くのobserve pattern関連機能が含まれています。

追加-イベント駆動型プログラミングの利点Android(RxJava)

ほとんどのAndroid applicationは、ユーザーまたはデータinteractionに基づいて構築されています。 (たとえば、対話が発生するとGUIが更新されます)。したがって、これらをset of eventsと見なし、これに基づいてアプリケーションを設計および構築することは、非常に直感的であり、内部および外部のイベントに適しています。

38
Ethan Choi

これらの利点を理解するには、まずコードベースがReactive Extensionsを採用することがどれほど有益であるかを理解する必要があります。

  • 構成可能性と変換

    • ストリームは非常に構成可能なインターフェースを提供します。これにより、(イベントの構造と時間に関する)変換操作を実行し、基本的にさまざまなストリーム間でシームレスに相互依存(依存関係の作成や別のストリームからの結果/エラーの活用など)を行うことができます。コールバックを使用してこれを行うことはできますが、3つの要求と同じくらい簡単な、より複雑なユースケースを実装しようとすると、コードはすぐに読みにくくなります。一方、Rxではvery複雑なシナリオを実装してもスムーズに見えます。
  • スレッド化と非同期操作

    • Rxを使用すると、ストリーム内のさまざまなポイントで作業を実行するために使用するスレッドを非常に細かく制御できます。ここですでに対照を示すために、レトロフィットで使用される基本的な呼び出し方法は、ワーカースレッドで作業をスケジュールし、結果を呼び出し元のスレッドに転送するだけです。ストリームとして宣言された場合、レトロフィットはスレッド化を処理せず、ユーザーに制御権を与えるだけです。
  • Rxライブラリ

    • すでにお気づきかもしれませんが、Reactive拡張機能を活用してさまざまな機能をストリームとして実装するライブラリは無数にあります。リクエストを処理するときに簡単に利用できます

これら以外にも他の利点がありますが、事後対応することは非常に有益であることがわかります。リクエストは、ストリームの操作を学び、コードベースに徐々にストリームロジックを導入するための非常に良い出発点です。

代替品ではありません。 RxJavaとRetrofitは完全に一致しているため、そもそもRetrofitでRxJavaがネイティブでサポートされています。

10
koperko