【Kotlin/Android/RxJava】subscribeメソッドの使い方!subscribeByとの違い

この記事からわかること

  • Android Studio/KotlinRxJava使い方
  • subscribeメソッドの使い方
  • subscribeByとの違い
  • Observableオブジェクト観測する方法

index

[open]

\ アプリをリリースしました /

みんなの誕生日

友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-

posted withアプリーチ

環境

subscribeメソッドとは?


@CheckReturnValue
@SchedulerSupport(SchedulerSupport.NONE)
@NonNull
public final Disposable subscribe(@NonNull Consumer<? super T> onNext, @NonNull Consumer<? super Throwable> onError,@NonNull Action onComplete) {
    Objects.requireNonNull(onNext, "onNext is null");
    Objects.requireNonNull(onError, "onError is null");
    Objects.requireNonNull(onComplete, "onComplete is null");

    LambdaObserver<T> ls = new LambdaObserver<>(onNext, onError, onComplete, Functions.emptyConsumer());

    subscribe(ls);

    return ls;
}

RxJavaのsubscribeObservableオブジェクトを購読してそのObservableオブジェクトから発行されるイベントを処理するためのメソッドです。返り値はDisposable型になっておりDisposable.disposeメソッドを使用して観測中のObservableオブジェクトの購読を停止させることができます。

引数の中でObservableオブジェクトから発行されるイベントを取得することができ、それぞれのイベントに対して処理を分岐させることが可能です。onNextonErrorでは流れてきたデータやエラーを引数で受け取ることができます。例えば以下の場合変数dataに流れてきたデータが格納されている状態になります。onCompleteは流れてくるデータがないので引数は不要です。

disposable = Observable.create<String> { emitter ->
    emitter.onNext("Hello")
    emitter.onNext("World")
    var flag = true
    if (flag) {
        emitter.onComplete()
    } else {
        emitter.onError(Exception("ERROR") )
    }
}.subscribe(
    { data -> Log.e("RxJava",data) },
    { error -> Log.e("RxJava",error.toString()) },
    { Log.e("RxJava","onComplete") }
)

記法の種類

subscribeメソッドの引数の記法はいくつかあり、かつ正しい記法で書かないとエラーになるのでここで一旦まとめておきます。

ラムダ式

引数からデータやエラーを取得できる

observable.subscribe(
    { data -> /* onNext イベントを処理するためのコード */ },
    { error -> /* onError イベントを処理するためのコード */ },
    { /* onComplete イベントを処理するためのコード */ }
)

引数名省略ラムダ式

observable.subscribe(
    { /* onNext イベントを処理するためのコード */ },
    { /* onError イベントを処理するためのコード */ },
    { /* onComplete イベントを処理するためのコード */ }
)

関数リファレンス

observable.subscribe(
    ::onNextFunction, // onNext イベントを処理するための関数
    ::onErrorFunction, // onError イベントを処理するための関数
    ::onCompleteFunction // onComplete イベントを処理するための関数
)

この場合はそれぞれ関数を用意しておきます。

private fun onNextFunction(data: String) {
    Log.e("RxJava",data)
}

private fun onErrorFunction(error: Throwable) {
    Log.e("RxJava",error.toString())
}

private fun onCompleteFunction() {
    Log.e("RxJava","onComplete")
}

必要なイベントのみ

observable.subscribe(
    { /* onNext イベントを処理するためのコード */ },
    { /* onError イベントを処理するためのコード */ }
)

subscribeByの使い方と違い

RxJavaをKotlinで使用する上では扱いやすい拡張機能の入ったRxKotlinを導入しておくことで使えるようになるのがsubscribeByメソッドです。先に紹介したsubscribeメソッドでは名前付き引数で指定することができず、ラムダを順番通りに配置するしかありません。これを解消できるのがsubscribeByメソッドです。以下のように明示的に引数名を指定して記述することができるので順番を変えても正常に動作します。

名前付き引数バージョン

observable.subscribeBy(
    onNext = { data: String->
        onNextFunction(data)
    },
    onError = { throwable: Throwable ->
        onErrorFunction(throwable)
    },
    onComplete = {
        onCompleteFunction()
    }
)

↓順番を入れ替えた。

observable.subscribeBy(
    onComplete = {
        onCompleteFunction()
    },
    onNext = { data: String->
        onNextFunction(data)
    },
    onError = { throwable: Throwable ->
        onErrorFunction(throwable)
    }
)

まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。

ご覧いただきありがとうございました。

searchbox

スポンサー

ProFile

ame

趣味:読書,プログラミング学習,サイト制作,ブログ

IT嫌いを克服するためにITパスを取得しようと勉強してからサイト制作が趣味に変わりました笑
今はCMSを使わずこのサイトを完全自作でサイト運営中〜

New Article

index