【Kotlin/Android】RxJavaのconcatWithメソッドの使い方!直列処理の実装
この記事からわかること
- Android Studio/KotlinでRxJavaの使い方
Observable
のconcatWithメソッドの使い方- 非同期処理を順番に実行するには?
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
環境
- Android Studio:Flamingo
- Kotlin:1.8.20
Operator:concatWithメソッドの使い方
RxJavaのObservable
で使用できるOperatorのconcatWith
は非同期処理を順番に処理するためのメソッドです。「非同期処理Aの完了後に非同期処理Bを実行したい」場合などObservable
を直列に繋げたい場合に使用します。Completable
の場合はandThen
メソッドが同じ役割になります。
完了後に実行したい非同期処理をconcatWith
メソッドの引数に渡します。
Log.i("RxJava", "処理開始")
val observable1 = Observable.just(1, 2, 3)
val observable2 = Observable.just(4, 5, 6)
// observable1が完了した後にobservable2を実行
observable1.concatWith(observable2)
.subscribe { println("Received: $it") }
.addTo(compositeDisposable)
例えば上記の場合は「処理開始」が出力されobservable1が全て出力された後にobservable2が実行されることになります。concatWith
メソッドにObservable
を渡した場合はさらにメソッドチェーンで複数のObservable
を掛け合わせて実装することも可能です。
Log.i("RxJava", "処理開始")
val observable1 = Observable.just(1, 2, 3)
val observable2 = Observable.just(4, 5, 6)
val observable3 = Observable.just(7, 8, 9)
observable1
.concatWith(observable2)
.concatWith(observable3)
.subscribeBy(
onNext = {
Log.i("RxJava", it.toString())
}
).addTo(compositeDisposable)
- 処理開始
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
異なる非同期処理を渡す
concatWith
メソッドの引数に渡す非同期処理はObservable
以外でも問題ありません。
val observable1 = Observable.just(1, 2, 3)
val observable2 = Observable.just(4, 5, 6)
var completable1 = Completable.timer(3, TimeUnit.SECONDS)
observable1 // 最初に実行
.concatWith(completable1) // observable1が完了後に実行
.concatWith(observable2) // completable1が完了(3秒)後に実行
.subscribe {
Log.i("RxJava", it.toString())
}.addTo(compositeDisposable)
concatメソッドの使い方と違い
concat
もconcatWith
同様に非同期処理を順番に処理するためのメソッドです。違うのは以下の点になります。
concatWithメソッド
- インスタンスメソッド
- 引数には完了後に行いたいObservableを1つ渡す
concatメソッド
- 静的メソッド
- 引数には完了後に行いたいObservableを複数渡す
そのため複数のObservableを直列に繋げるときはconcat
メソッドを使用することでスッキリ記述することが可能です。
Log.i("RxJava", "処理開始")
val observable1 = Observable.just(1, 2, 3)
val observable2 = Observable.just(4, 5, 6)
val observable3 = Observable.just(7, 8, 9)
Observable.concat(observable1, observable2, observable3)
.subscribeBy(
onNext = {
Log.i("RxJava", it.toString())
}
)
.addTo(compositeDisposable)
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。