onActivityResult()가 deprecated 됨에 따라 사용중이던 코드들을 걷어내는 작업을 진행중이다.
레퍼런스에는 registerForActivityResult를 활용는 방법을 소개하고 있지만,
내부적으로 RxJava를 적극 사용하고있기 때문에, PublishSubject 를 이용한 콜백을 작성중이다.
<aside> 💡 PublishSubject

구독하기 전의 데이터는 무시하고, 구독 후 갱신되는 데이터만 받음
(LiveData랑 비슷한가..?)
</aside>
RxBus.kt
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)
}
RxEvent.kt
class RxEvent {
class Event1()
class Event2()
data class Event3(val id: Int, val name: String)
}
사용법
class MainActivity {
private val compositeDisposable = CompositeDisposable()
override fun onCreate() {
RxBus.listen(RxEvent.Event1::class.java)
.subscribeOn(AndroidSchedulers.mainThread())
.subscribe({ it ->
}, { e ->
}).also {
compositeDisposable.add(it)
}
RxBus.listen(RxEvent.Event3::class.java)
.subscribeOn(AndroidSchedulers.mainThread())
.subscribe({ it ->
// it.id
// it.name
}, { e ->
}).also {
compositeDisposable.add(it)
}
}
}
class SubActivity {
any1.onclickListener {
RxBus.publish(RxEvent.Event1())
}
any2.onclickListener {
RxBus.publish(RxEvent.Event3(100, "NAME"))
}
}
스마트택배 코드는 기능별로 모듈화가 되어있지만 데이터는 같이 묶여있다보니 모듈 간 이벤트를 전달해야 할 경우도 많다.
이러한 문제를 해결하기 위해 공용라이브러리 모듈에 해당 이벤트들을 모아두고 각 모듈에서 구독 후에 콜백 받게끔 해주었고, 용이하게 사용중이다.
Subject자체가 thread-safe 하지 않아서 멀티스레드 환경에서 이벤트를 발생시키는 거라면
100%보장할 순 없다고한다. (링크 참고)