개발일지
[Android] Observer Pattern / Event Bus 본문
- 어떤 클래스에 변화가 일어났을 때 이를 감지하여 다른 클래스에 통보해주는 것
- 객체의 상태 변화를 관찰하는 Observer 들의 목록을 객체에 등록하여 상태 변화가 있을 때마다 메소드 등을 통해 객체가 직접 목록의 각 Observer 에게 통지하도록 하는 디자인 패턴
- 외부 객체의 상태 변화에 따라 (Subject class) observer 객체(observer interface class)는 이에 상속되어 있는 다른 객체(concreteObserver)들에게 변화된 상태를 전달하고(notify 메소드) 상속된 객체는 그에 맞게 기능을 수행하는 형태로 구성됨
- 함수로 직접 요청하지 않았지만 시스템 또는 루틴에 의해 발생하게 되는 동작들을 이벤트라고 함
→ Observer 패턴은 어떤 일이 생기면 미리 등록한 객체들에게 상태 변화를 알려주는 역할을 하는 것
→ Subject 객체의 상태에 변화가 있을 때 Observer 들에게 상태 변화를 알린다. 그 이후 Observer들이 상태 변화에 맞게 행동을 취한다.
Subject : Observer 을 알고 있는 주체. 이는 Observer을 등록하고 제거하는데 필요한 인터페이스를 정의함
Observer : Subject 에서 변화했다고 알렸을 때 갱신해야 하는데 필요한 인터페이스 정의함
ConcreteSubject: 객체에게 (Observer들 에게) 알려줘야 할 상태를 저장하고 notify 해야 할 함수를 만들도록 한다.
ConcreteObserver: noti 를 받았을 때 행동할 로직을 작성함
Observer 클래스를 구현하기 위해서는 두개의 클래스가 필요함
1) 이벤트를 수신
2) 이벤트의 발생 및 전달
----------
//인터페이스 : 옵저버, 리스너
interface EventListener {
fun onEvent(count : Int)
}
//ClassB
class ClassB(var listener : EventListener){
fun count(){
for(i in 0..100){
listener.onEvent(i) //count 함수가 실행될때마다 인터페이스의 onEvent를 발생시킨다.
}}}
//ClassA
class ClassA : EventListener{
//EventListener의 onEvent 함수를 구체적으로 구현한다.
//ClassB에서 onEvent가 발생하면 ClassA로 이벤트가 넘어와 구현한 로직으로 수행이 되는데 이를 callback 이라고 한다.
override fun onEvent(num: Int){
print(num.toString())
}
fun start(){
val counter = ClassB(this)
counter.count()
} }
// Class B 에 옵저버 등록하고 Class B에서는 특정 변화가 있을 때마다 옵저버에게 신호를 준다.
Class A 는 옵저버인 interface를 impl 하여 옵저버 발동 시 수행될 로직을 구현
→ 즉 이벤트는 B 에서 발생하지만 그에 따른 구체적인 로직은 A에서 처리할 수 있는 것
// 이벤트 발생지와 구현부를 따로 가지는 패턴의 장점
버튼 클릭 시 새로운 액티비티를 띄우고 싶은데 그럴러면 안드로이드에서는 context도 필요하고 다른 부가적인 자원들이 필요하다. 그렇기 때문에 여러 객체들을 버튼 클래스 안에서 새롭게 생성해야 함
하지만 이러한 패턴을 사용하면 버튼 클릭 시 이벤트 신호만 주고 처리는 Activity 클래스에서 한다면 activity에 있는 자원을 그냥 활용하면 되는 것
→ 메모리 낭비 피할 수 있고 불필요한 코드 줄일 수 있음
======================================================================
observer 예제
https://inuplace.tistory.com/238
https://jinsangjin.tistory.com/88
Event Bus
- 컴포넌트 간에 비동기적 통신을 가능하게 하는 라이브러리
-전역 단위로 데이터 송/수신 가능함 . (frag↔frag / Frag↔ Activity / frag ↔ thread / frag ↔ service )또한 비동기식 데이터를 즉각적으로 Callback 받을 수 있음
-어노테이션 기반이며 UI 백그라운드 스레드에서 수행이 잘 됨
-POJO(Plain Old Java Object)
- 아무 조건 없이 어디서든 클래스 단위로 이벤트를 던질 수 있다.
- 이벤트를 수신 받기 원하는 곳을 event bus 에 register 해두면 이벤트를 수신 받을 수 있다.
- 이벤트를 더 이상 받고 싶지 않다면 unregister 한줄만 해주면 된다.
- 컴포넌트 간에 통신을 가볍게 할 수 있다, - 어노테이션 기법으로 이벤트 발신자와 수신자를 분리한다. / Activity Fragment UI 백그라운드 스레드에서도 잘 작동한다. / 복잡하고 오류를 발생하기 쉬운 종속성 문제와 생명주기 문제를 방지할 수 잇음
- 라이브러리로 인해 코드를 간결화 할 수 있다.
- 빠르고 가벼움
- implementation 'org.greenrobot:eventbus:3.2.0' 추가
- 전달할 객체들을 담을 클래스 생성
'Android' 카테고리의 다른 글
[Android] gradle (0) | 2021.06.29 |
---|---|
[Android][Kotlin] Scope Function, Collections (0) | 2021.06.29 |
[Android][Kotlin] return and jumps and This-expressions (0) | 2021.06.29 |
[Android] Scoped Storage (0) | 2021.06.29 |
[Android][Kotlin] SharedPreferences (0) | 2021.06.29 |