onActivityResult()가 deprecated 됨에 따라 사용중이던 코드들을 걷어내는 작업을 진행중이다.

레퍼런스에는 registerForActivityResult를 활용는 방법을 소개하고 있지만,

내부적으로 RxJava를 적극 사용하고있기 때문에, PublishSubject 를 이용한 콜백을 작성중이다.

<aside> 💡 PublishSubject

스크린샷 2022-07-12 오후 6.46.46.png

구독하기 전의 데이터는 무시하고, 구독 후 갱신되는 데이터만 받음

(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"))
		}
}

스마트택배 코드는 기능별로 모듈화가 되어있지만 데이터는 같이 묶여있다보니 모듈 간 이벤트를 전달해야 할 경우도 많다.

이러한 문제를 해결하기 위해 공용라이브러리 모듈에 해당 이벤트들을 모아두고 각 모듈에서 구독 후에 콜백 받게끔 해주었고, 용이하게 사용중이다.

+ 추가 내용 (2023.03.21)

Subject자체가 thread-safe 하지 않아서 멀티스레드 환경에서 이벤트를 발생시키는 거라면 100%보장할 순 없다고한다. (링크 참고)