【Kotlin/Android/RxJava】subscribeメソッドの使い方!subscribeByとの違い
この記事からわかること
- Android Studio/KotlinでRxJavaの使い方
- subscribeメソッドの使い方
- subscribeByとの違い
- Observableオブジェクトを観測する方法
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
環境
- Android Studio:Flamingo
- Kotlin:1.8.20
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のsubscribe
はObservableオブジェクトを購読してそのObservableオブジェクトから発行されるイベントを処理するためのメソッドです。返り値はDisposable
型になっておりDisposable.dispose
メソッドを使用して観測中のObservableオブジェクトの購読を停止させることができます。
引数の中でObservableオブジェクトから発行されるイベントを取得することができ、それぞれのイベントに対して処理を分岐させることが可能です。onNext
とonError
では流れてきたデータやエラーを引数で受け取ることができます。例えば以下の場合変数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)
}
)
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。