【Kotlin/Android】RxJavaのDisposableの使い方!購読を停止する方法
この記事からわかること
- Android Studio/KotlinでRxJavaの使い方
- Disposableオブジェクトとは?
- 処理を停止させる方法
- 複数まとめて管理するCompositeDisposableとは?
- RxKotlinのaddToメソッドの使い方
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
環境
- Android Studio:Flamingo
- Kotlin:1.8.20
Observableオブジェクトの処理を停止する方法
Observableオブジェクトの購読を開始するsubscribe
メソッドを実行すると返り値でDisposable
型が返ります。Disposable
オブジェクトを保持しておき、購読を停止させたいタイミングでdispose
メソッドを実行します。
var disposable = Observable.create<String> { emitter ->
emitter.onNext("Hello")
}.subscribe(
{ length -> Log.e("RxJava", length.toString()) }
)
// 購読を停止させる
disposable.dispose()
明示的に購読を停止させない場合はライフライクルの中で自動的に破棄されるようにonDestroy
の中などに実装しておきます。
class MainActivity : AppCompatActivity() {
var disposable: Disposable? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
disposable = Observable.create<String> { emitter ->
emitter.onNext("Hello")
}.subscribe(
{ length -> Log.e("RxJava", length.toString()) }
)
}
override fun onDestroy() {
super.onDestroy()
// プログラムが終了する前にObservableの購読を解除
disposable?.dispose()
}
}
複数のDisposableをまとめて管理する:CompositeDisposable
複数のDisposableオブジェクトをまとめて管理したい場合はCompositeDisposable
クラスを使用します。CompositeDisposable
は内部的にコレクション形式でDisposableオブジェクトを複数保持することができるので、このクラスにまとめて管理したいDisposableオブジェクトをadd
メソッドを使用して追加していきます。
class MainActivity : AppCompatActivity() {
var compositeDisposable: CompositeDisposable = CompositeDisposable()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
var disposable = Observable.create<String> { emitter ->
emitter.onNext("Hello")
}.subscribe(
{ length -> Log.e("RxJava", length.toString()) }
)
compositeDisposable.add(disposable)
var disposable2 = Observable.create<String> { emitter ->
emitter.onNext("World")
}.subscribe(
{ length -> Log.e("RxJava", length.toString()) }
)
compositeDisposable.add(disposable2)
}
override fun onDestroy() {
super.onDestroy()
// プログラムが終了する前にObservableの購読を解除
compositeDisposable.dispose()
}
}
購読を破棄したい場合は同様にdispose
メソッドを使用することで破棄することが可能です。
RxKotlinのaddToメソッドを使用する
RxKotlinを導入している場合はCompositeDisposable
クラスへの追加をより簡潔に実装できるaddTo
メソッドが使用できるようになります。この方法ではメソッドチェーンでそのまま記述できるためコード量を減らし可読性も向上させることができます。
Observable.create<String> { emitter ->
emitter.onNext("Hello")
}.subscribeBy(
onNext = { length -> Log.e("RxJava", length.toString()) }
).addTo(compositeDisposable)
disposeとclearメソッドの違い
CompositeDisposable
では似たような役割のメソッドにdispose
とclear
があります。両者の違いと使い分けは以下のようになります。
disposeメソッド
dispose
はCompositeDisposable
が保持している全てのDisposable
オブジェクトのdispose
を呼び出し明示的に購読を停止させます。一度dispose
を呼び出したCompositeDisposable
オブジェクト自体も破棄されて使用できなくなるので再度使用したい場合は再度インスタンス化する必要があります。
compositeDisposable.dispose()
// 追加しても破棄されたままなので意味がない
compositeDisposable.add(disposable2)
// 使用可能にするには再度インスタンス化する
compositeDisposable = CompositeDisposable()
clearメソッド
clear
はCompositeDisposable
が保持している全てのDisposable
オブジェクトを削除します。破棄されたDisposable
オブジェクトのdispose
メソッドは呼ばれず、CompositeDisposable
オブジェクト自体も再利用が可能です。
// 内部的に保持していたDisposableをクリアー
compositeDisposable.clear()
// CompositeDisposableはまだ有効なので追加すれば動作する
compositeDisposable.add(disposable2)
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。