忘れん坊のサンタクロース

iOS,Androidアプリ開発についての忘備録です。技術関連情報など掲載していこうかと考えています。時々関係ないことも書くかも。。

RxJava2の使い方をなんとなく

RxJava2使ってみたいけれど学習コスト高いって聞くし現状のコードでいいかなーって方、実は私もそう思ってました。
しかし、DroidKaigi2017に出席した際、かなりのセッションでRxJavaについて触れられていて、もうAndroidに限らずアプリエンジニアとしてスタンダードなのかなと思い、学習を始めました。今回はそんなこんなで学習を進めた結果なんとなくわかってきたことを若輩エンジニアなりに書きたいと思います。

ストリームがどうこうバックプレッシャーがうんぬんと言うお話は一切はしませんw
かなりざっくりとした使い方だけをご説明します。

例としてとりあえず文字列が欲しい時の超簡単なObservableを実装したいと思います。
まず全体的な流れとしては以下になります。

1.Observableを定義する
2.Observableをsubscribe(購読)する
3.値をゲット

ではまずObservableを実装してみましょう。
これはObservableがsubscribeされた時の挙動を定義します。

Observable<String> observable = Observable.create(e -> {
    String name = "tokyo tanaka";
    return e.onNext(name);
});

これでobservableがsubscribeされた時、nameが渡されるようになります。
では、このobservableをsubscribeしましょう。

TextView textView;
observable.subscribe(s ->{
    textView.setText(s);
});

はい!これでtextViewに先ほどのnameがセットされました!!
、、ここでみなさん、これの何が嬉しいわけ?っと思いましたでしょうか。

ではちょっと応用を足して例えば、
API通信した結果の文字列を取得したいときObservableを使用すると、

Observable.create(e -> {
     //例えば同期通信処理
    String name = ApiClient.getInstance().getName();
    if(name == null){
        name = "failed name";
    }
    e.onNext(name);
})
.observableOn(AndroidSchedulers.mainThread())    //subscribe内での処理を行うスレッド指定(メイン)
.subscribeOn(Schedulers.io());    //Observable.create()内での処理を行うスレッド指定(ワーカー)

これをsubscribeすると通信処理が終わったかを意識せずにTextViewに値をセットすることができます。状態変数を持たなくていいということですね。
RxJavaのいいところは他にもあり、Observableをくっつけたり、違う値を返すObservableにできたりできます(map(), flatMap()といったオペレータ群)、RxJavaが分かり始めるとこういったオペレータ群にどんなものがあるのかを探すのが楽しくなっていくと思います。多分。

何はともあれ、使い方がわかってくると無敵なんじゃないかってくらい便利な代物ですので、みなさんもぜひ学習して、使ってみてください。