일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 안드로이드
- Rxjava 안드로이드
- RxKotiln
- 안드로이드 개발자
- RxJava
- Kotiln
- Dev6
- react
- Flutter
- 반응형 프로그래밍
- 코딩테스트
- Java
- android
- 알고리즘
- android compose
- 개발자
- Swift 문법
- 코루틴
- 이펙티브코틀린
- 안드로이드 컴포즈
- 프로그래머스
- Firebase
- 코틀린
- 안드로이드 다이얼로그
- MVVM
- Go언어
- 이펙티브 코틀린
- swift map
- 잡담
- 일상
- Today
- Total
최데브는 오늘도 프로그래밍을 한다.
RxJava를 Event Bus 처럼 쓰기 본문
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를 이용해서 위와 같은 방법으로 처리하면
훨씬 적은 코드로도 어디서든지 효율적으로 원하는 자료형의 값을 자유롭게 전달 할 수 있다.
'Android > RxJava, RxKotlin' 카테고리의 다른 글
RxJava - subscribeOn, observeOn 를 제대로 쓰고 있는걸까? (0) | 2021.10.20 |
---|---|
RxJava - Hot Observable , Cold Observable (0) | 2021.10.20 |
RxJava - Observable과 Observer 의 차이 (0) | 2021.06.12 |
RxJava - Observable을 제외한 다른 생산자들 (0) | 2021.06.12 |
RxJava - 시작하기 (0) | 2021.06.12 |
RxJava , RxKotiln 이란? (0) | 2021.06.08 |