【Kotlin/Android】RxJavaのDisposableの使い方!購読を停止する方法

【Kotlin/Android】RxJavaのDisposableの使い方!購読を停止する方法

この記事からわかること

  • Android Studio/KotlinRxJava使い方
  • Disposableオブジェクトとは?
  • 処理停止させる方法
  • 複数まとめて管理するCompositeDisposableとは?
  • RxKotlinaddToメソッドの使い方

index

[open]

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

みんなの誕生日

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

posted withアプリーチ

環境

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では似たような役割のメソッドにdisposeclearがあります。両者の違いと使い分けは以下のようになります。

disposeメソッド

disposeCompositeDisposableが保持している全てのDisposableオブジェクトのdisposeを呼び出し明示的に購読を停止させます。一度disposeを呼び出したCompositeDisposableオブジェクト自体も破棄されて使用できなくなるので再度使用したい場合は再度インスタンス化する必要があります。

compositeDisposable.dispose()
// 追加しても破棄されたままなので意味がない
compositeDisposable.add(disposable2)

// 使用可能にするには再度インスタンス化する
compositeDisposable = CompositeDisposable()

clearメソッド

clearCompositeDisposableが保持している全てのDisposableオブジェクトを削除します。破棄されたDisposableオブジェクトのdisposeメソッドは呼ばれず、CompositeDisposableオブジェクト自体も再利用が可能です。

// 内部的に保持していたDisposableをクリアー
compositeDisposable.clear()

// CompositeDisposableはまだ有効なので追加すれば動作する
compositeDisposable.add(disposable2)

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

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

searchbox

スポンサー

ProFile

ame

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

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

New Article

index