【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)

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

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

searchbox

スポンサー

ProFile

ame

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

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

New Article

index