싱글톤으로 아래를 선언하고,
main 처럼 사용하면 됩니다.
장점은 클래스 타입에 따라서 event가 발생하게 되므로 데이터 클래스 관련 처리를 callback처럼 사용할 수 있습니다.
예를 들어, thread1 에서 서버나 db 데이터를 가져 오고 그것을 mainthread로 가져 오려고 할 때,
publish()를 사용하면 adapter에 데이터를 가공 후 바로 저장할 수 있습니다.
특히..
서버나 db에서 데이터를 가져 올 때, 몇 개를 가져 오는지 알 수 없어서 항목을 하나씩 업데이트 해야 할 때 좋을 것 같습니다.
import io.reactivex.Observable
import io.reactivex.subjects.PublishSubject
// 혹은 implementation "io.reactivex.rxjava2:rxjava:2.2.19"
object RxBus {
private val publisher = PublishSubject.create<Any>()
fun publish(event: Any) {
publisher.onNext(event)
}
fun <T> listen(eventType: Class<T>): Observable<T> = publisher.ofType(eventType)
}
fun main(args: Array<String>) {
// Custom MessageEvent class
data class MessageEvent(val action: Int,
val message: String)
// Listen for MessageEvents only
RxBus.listen(MessageEvent::class.java).subscribe {
println("Im a Message event ${it.action} ${it.message}")
}
// Listen for String events only
RxBus.listen(String::class.java).subscribe {
println("Im a String event $it")
}
// Listen for Int events only
RxBus.listen(Integer::class.java).subscribe {
println("Im an Int event $it")
}
// Publish events
RxBus.publish(MessageEvent(1, "Hello, World"))
RxBus.publish("Testing")
RxBus.publish(123)
RxBus.publish(456)
}
출처 : android.jlelse.eu/super-simple-event-bus-with-rxjava-and-kotlin-f1f969b21003