Android 事件总线 EventBus入门及使用

何为事件总线?

是对发布-订阅模式的一种实现。 它是一种集中式事件处理机制,允许不同的组件之间进行彼此通信而又不需要相互依赖,达到一种解耦的目的。学习它之前最好先了解下观察者模式
说白了就是不同组件间通信的一种标准也可以用于异步线程与主线程通信,相比于传统的Handler、BroadcastReceiver、接口回调,它更加简洁,使用简单,而且解耦。基本上是人见人爱的。可以应用于Activity和fragment之间碎片和碎片之间主线程与子线程之间等场景。

EventBus

从名字上来看,Event事件,Bus巴士,事件就像巴士上的乘客一样,从汽车站上车,坐巴士到达不同的地方。
EventBus
这个图是官方githup上的,publisher是消息推送者即被观察者,将消息推送给eventbus然后转发给各个接收者,即观察者。

简单使用

导入依赖

 implementation 'org.greenrobot:eventbus:3.1.1'

处理混淆,在proguard-rules.pro中加入

-keepattributes *Annotation*
-keepclassmembers class ** {
    @org.greenrobot.eventbus.Subscribe <methods>;
}
-keep enum org.greenrobot.eventbus.ThreadMode { *; }

# Only required if you use AsyncExecutor
-keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent {
    <init>(java.lang.Throwable);
}

然后编写一个简单的事件类


public class Event {
    String message;//要传递的消息

    Event(String message) {
        this.message = message;
    }

    public String getMessage() {

        return message;
    }
}

然后在需要接受消息的类中注册
这个过程其实就是在把此类当观察者存起来。后续发送方法的时候需要遍历

   EventBus.getDefault().register(this);

记得注销 避免内存泄漏

EventBus.getDefault().unregister(this); 

然后在需要接受消息的类中使用此方法接收消息
ThreadMode.MAIN的意思是onEvent方法在主线程即UI线程上运行
还有其他三种

  • ThreadMode.POSTING 在哪个线程发布的onEvent方法就在哪执行
  • ThreadMode.BACKGROUND 在ui线程中发布的,onEvent方法就在子线程执行,在子线程发布的就继续在子线程
  • ThreadMode.AYSNC 无论在哪发布的,onEvent方法都会创建新线程然后执行
  @Subscribe(threadMode = ThreadMode.MAIN)
    public void onEventMain(Event event) {

        String msg = event.getMessage();
        Log.i(TAG, "Event: " + event.getMessage());
    }

然后发送消息

  EventBus.getDefault().post(new Event("我发的信息"));

这样就可以收到消息了, EventBus.getDefault()得到的是一个EventBus的单例,使用post方法传进一个Event类,然后EventBus就会找哪儿的onEvent方法中的参数是Event ,找到了就会调用它,消息就是这么传递的,如果有很多onEvent方法的参数都是Event那么都会调用。

总结

Eventbus使用起来很简单,根据上面的也看出来了,发送不同的消息可以新建不同的Event类,通过改变接收方法onEvent方法中的参数来改变即可。另外EventBus是不支持跨进程通信的,如果要实现这个,可以看看饿了么团队基于EventBus的HermesEventBus

猜你喜欢

转载自blog.csdn.net/HJsir/article/details/80315585
今日推荐