안드로이드

[Android] EventBus, RxEventBus 사용법

코딩하는후운 2022. 10. 27. 10:24
반응형

Event Bus


-Fragment1과 Fragment2가 메시지를 주고받는 예제.

1. Gradle추가
compile 'com.squareup:otto:1.3.7'

2.전역에서 같은 객체를 가지고 오기위한 싱글톤인 Global Bus 생성

public class GlobalBus{
  private static Bus sBus;

  public static Bus getBus(){
    if(sBus == null)
      sBus = new Bus();
    return sBus;
  }
}


3.이벤트 버스에서 실행 시킬 메서드가 있는 Events 생성

public class Events{
  public static class Event1{
    private String message;

    public Event1(String message){
      this.message = message;
    }

    public String getMessage(){
      return message;
    }
  }
}



4.이벤트 버스의 결과를 받을 곳에 Subscribe 설정(Fragment1)
-Fragment1에 GlobalBus를 등록해 줍니다.

@Override
public void onCreate(@Nullable Bundle saveInstanceState){
  super.onCreate(saveInstanceState);
  GlobalBus.getBus().register(this);
}


-물론 Fragment1이 삭제 되면 등록을 해지 또한 해주어야 합니다.

@Override
public void onDestroyView(){
  GlobalBus.getBus().unregister(this);
}



-@Subscribe어노테이션 아래에 connectEvent1 이름의 함수를 구독합니다.(함수명은 아무거나 적어도됨.)
-connectEvent1 변수 안에 Events클래스에서 Event1을 넣어줍니다.
-Fragment2에서 이벤트 버스를 post하였을 때 보낸 메시지를 로그에 찍을 수 있습니다.

@Subscribe
public void connectEvent1(Events.Event1 event1){
  Log.d("tag", event1.getMessage());
}



5.이벤트 버스를 보낼 곳에 post를 호출하여 구독 되어진 곳으로 정보를 전달(Fragment2)

Events.Event1 event1 = new Events.Event1("Fragment1으로 메시지 전달");
GlobalBus.getBus().post(event1);

 



RxEventBus

1.싱글톤 패턴으로 RxEventBusHelper를 만들어 줍니다.
참고로 자바에서는 싱글톤 패턴을 만족시키기 위해 인스턴스 변수를 선언하고 정적 메서드를 추가하지만
코틀린에서는 object하나만 선언하면 됩니다.

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

  fun sendEvent(str: String){
    mSubject.onNext(str)
  }
}



2. EventBus를 받을 부분에 구독을 합니다.

RxEventBusHelper.mSubject
    .subscribe({
      Log.d("tag", it)
    })


3. Event를 구독한 화면에 데이터를 전달합니다.

RxEventBusHelper.sendEvent("전송")

 

 


2022년 10월 나는 이렇게 사용중..

object RxBus {
    private val publisher = PublishSubject.create<Any>()
    private val behaviorSubject = BehaviorSubject.create<Any>()

    fun behaviorSubject(event: Any) {
        behaviorSubject.onNext(event)
    }

    fun publish(event: Any) {
        publisher.onNext(event)
    }

    fun <T> listen(eventType: Class<T>): Observable<T> = publisher.ofType(eventType)
    fun <T> behaviorListen(eventType: Class<T>): Observable<T> = behaviorSubject.ofType(eventType)
}

 

class RxEvent {
    data class 이벤트함수명(val time: Int)
}

 

사용법

private fun initRxBusEvent() {
    RxBus.listen(RxEvent.이벤트함수명::class.java)
        .subscribeOn(Schedulers.newThread())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe({
            binding.tvCallTime.post {
                binding.tvCallTime.text = getTimeStamp(it.time)
            }
        }) {
            it.printStackTrace()
        }.let { compositeDisposable.add(it) }
}

 

 

 

 

참조 :

https://black-jin0427.tistory.com/30?category=727620 

 

[Android, EventBus] 이벤트 버스 사용법

Sqare 에서 만든 Otto 라이브러리 event bus 사용법에 대해 알아보겠습니다. otto git hub 주소 : https://github.com/square/otto 아래 예제는 Fragment1 과 Fragment2 가 메시지를 주고받는 예제입니다. 1. Grad..

black-jin0427.tistory.com

https://black-jin0427.tistory.com/35?category=727620 

반응형