개발일지

[Android] Observer Pattern / Event Bus 본문

Android

[Android] Observer Pattern / Event Bus

강강강 2021. 6. 29. 19:13

  • 어떤 클래스에 변화가 일어났을 때 이를 감지하여 다른 클래스에 통보해주는 것 
  • 객체의 상태 변화를 관찰하는 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 백그라운드 스레드에서도 잘 작동한다. / 복잡하고 오류를 발생하기 쉬운 종속성 문제와 생명주기 문제를 방지할 수 잇음 
  • 라이브러리로 인해 코드를 간결화 할 수 있다. 
  • 빠르고 가벼움 

 

  1. implementation 'org.greenrobot:eventbus:3.2.0' 추가 
  2. 전달할 객체들을 담을 클래스 생성 

'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