【Kotlin/Android】RxJavaのDisposableの使い方!購読を停止する方法
この記事からわかること
- Android Studio/KotlinでRxJavaの使い方
- Disposableオブジェクトとは?
- 処理を停止させる方法
- 複数まとめて管理するCompositeDisposableとは?
- RxKotlinのaddToメソッドの使い方
index
[open]
\ アプリをリリースしました /
環境
- 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)
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。






