최데브는 오늘도 프로그래밍을 한다.

RxJava를 Event Bus 처럼 쓰기 본문

Android/RxJava, RxKotlin

RxJava를 Event Bus 처럼 쓰기

최데브 2021. 10. 5. 23:04
반응형

Event Bus 라는 라이브러리는 버스 네트워크의 동작 방식과 유사하게 하나의 이벤트를 동일 채널에 연결된 모든 노드들에게 보내는 역할을 해주는 라이브러리다.

 

안드로이드에서는 특정 동작을 했을때 intent 하거나 fragment 와 activity 사이의 데이터 전달을 할때 bundle이나 콜백 등 이런 동작들을 할 때가 있는데  이런 동작들은 코드의 재사용성을 줄이고 코드를 복잡하게 만들어서 

깔끔하지 못한 코드가 될 수 있다.

 

이럴때 결합도를 낮추고 UI 끼리 데이터 통신을 더 편하게 처리하는게 이벤트 버스의 개념이다.

나는 interface 를 만들어서 콜백처리하는게 코드가 증가하고 불편해서 이 개념을 빌려다 쓸때가 많다.

 

Rxjava로 이러한 동작을 어떻게 하게 할 수 있을까?

 

아래 코드처럼 RxEventBusHelper 를 만들어준다.

object RxEventBusHelper {
	 val Subject = PublishSubject.create<String>()
}

PublishSubject 객체의 경우 구독 이후에 갱신된 값에 대해서만 값을 받는다.

 

아래 다이어그램의 세번째 줄에서 구독하기 이전에 갱신된 빨간공, 초록공은 무시하고 파란 공만 받고 있는 것을 볼 수 있다. 과거에 데이터를 무시하고 새로 갱신되는 값만 보고 싶은 경우 사용하기 유용하다. 대표적으로 버튼을 클릭하는 이벤트를 PublishSubject로 사용하기도 한다.

 

그리고 위 코드에 

object RxEventBusHelper {
	 val Subject = PublishSubject.create<String>()
     
    fun sendEvent(str: String) {
        Subject.onNext(str)
    }
}

sendEvent 라는 함수를 추가해보자.

해당 함수는 onNext를 사용해서 값을 옵저버에 전달한다.

str : String 은 쓰고 싶은 형태의 데이터에 맞게 자료형을 만들어주면 된다. Int , List<> 등등 사용가능하다.

 

그럼 실제로 액티비티에서 사용할때는 어떻게 호출하면 좋을까?

아래 코드처럼 특정 버튼을 눌렀을때 클릭! 이라는 문자열을 전달하게 된다.

        //카메라 클릭
        imageView.setOnClickListener {
            RxEventBusHelper.sendEvent("클릭!")
    }

그리고 클릭! 이라는 문자열을 전달받고 싶은곳에서는

아래처럼 사용하면 Log 에 "클릭!" 이 나오는것을 확인 할 수 있다.

            //Rx로 이벤트 버스 적용
            RxEventBusHelper.Subject
                .subscribe {
                	Log.v("check" , it)
                }

콜백을 사용해도 이런 문제를 충분히 해결 할 수 있지만 Rx를 이용해서 위와 같은 방법으로 처리하면

훨씬 적은 코드로도 어디서든지 효율적으로 원하는 자료형의 값을 자유롭게 전달 할 수 있다. 

 

반응형
Comments