반응형
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) }
}
참조 :
반응형
'안드로이드' 카테고리의 다른 글
[Android] Fragment replace add 차이 (0) | 2022.11.04 |
---|---|
Firebase 설정, firebase콘솔에 앱등록 (0) | 2022.11.04 |
[Android] Dependency, Dependency Injection (0) | 2022.10.27 |
[Android] DI란?, Dagger2 사용법에 대해 알아보자 (0) | 2022.10.27 |
[Android] Dagger에 대해 알아보자 (0) | 2022.10.27 |