[Android] RxJavaでEventBusを置き換える

RxJavaを使うことで、比較的簡単にEventBusを置き換えることができます。個人的にはEventBusを使う方が好きですが、RxJavaしか使っていないプロジェクトも多いと思いますので、そういう場合にEventBusを使わずRxJavaで済ませるならそれでもいいかなと思います。

RxJavaを用いたEventBusの置き換えについては、以下の記事で紹介されているコードが使えます。Kotlinのコードになりますが、10行程度の実装でEventBusっぽい処理を実装することができます。

具体的には、以下のような実装となります。RxJava 2.1.15で動作を確認しています。RxBus#postでイベントの発行を行い、RxBus#streamでイベントの購読を行います。非常にシンプルな実装で、とても良いと思います。

object RxBus {
    private val subject = PublishSubject.create()

    fun post(event: Any) {
        subject.onNext(event)
    }

    fun  stream(event: Class): Observable = subject.hide().ofType(event)
}

このRxBusの使い方については、元記事よりも詳しく書いておいた方がいいかと思いましたで、ちょっと補足してみます。

RxBus#streamでイベントの購読を行う際、Disposableが返ります。こちらはメンバ変数として持っておき、適切なタイミングでdisposeします。onCreateで購読した場合は、onDestroyあたりでdisposeすることになるかと思います。

class MainActivity : AppCompatActivity() {

    private var disposable: Disposable? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        button.setOnClickListener {
            startActivity(Intent(this, SecondActivity::class.java))
        }

        if (disposable == null) {
            // Eventの購読
            disposable = RxBus.stream(Event::class.java).subscribe {
                textView.text = it.text
            }
        }
    }

    override fun onDestroy() {
        super.onDestroy()

        disposable?.dispose()
        disposable = null
    }
}

あとは普通にRxBus#postでイベントを発行してあげればOKです。

class SecondActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_second)

        button.setOnClickListener {
            // Eventの発行
            val text = editText.text.toString()
            val event = Event(text)
            RxBus.post(event)

            finish()
        }
    }
}

イベントはどんなクラスでも大丈夫ですが、今回はシンプルに以下のような実装としました。Kotlinだと簡潔に書けてとても良いですね。

data class Event(val text: String)

RxBusを使ったサンプルアプリをGitHubに公開しておきました。2つのActivityとRxBusから構成される、極めて簡単なアプリとなっています。Acivity間の通知をRxBusで行っています。