EventBus
-
Less code, better quality.
与otto对比 -
EventBus是一个Android端优化的publish/subscribe消息总线,简化了应用程序内各组件间、组件与后台线程间的通信。比如请求网络,等网络返回时通过Handler或Broadcast通知UI,两个Fragment之间需要通过Listener通信,这些需求都可以通过EventBus实现。
优缺点
- 完全解耦了请求链之间的关系,避免了请求者被长持有,
- 又比广播更轻量,比LocalBroadcast则更强大,
- 接口简单实用,集成方便
- 简化代码
- 各种Event的定义工作量大。
- 限定了方法名(3.0已经可以自定义)
用法参考这里和这里
- 在Gradle脚本中添加 EventBus 依赖 compile 'org.greenrobot:event:3.0.0'
- 定义events
public class MessageEvent {
public final String message;
public MessageEvent(String message) {
this.message = message;
}
}
- 准备订阅者 订阅者需要实现event接收方法,当event被post时被调用。该方法由注解关键字 @Subscrib 来定义。自从EventBus3.0开始,该方法名称可以自由规定(去掉了2.0版本的定义约束)
// This method will be called when a MessageEvent is posted (in the UI thread for Toast)
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(MessageEvent event) {
Toast.makeText(getActivity(), event.message, Toast.LENGTH_SHORT).show();
}
// This method will be called when a SomeOtherEvent is posted
@Subscribe
public void handleSomethingElse(SomeOtherEvent event) {
doSomethingWith(event);
}
- 订阅者们(Subscribers)需要注册以及接触注册它们自己到总线Bus。只有订阅者被注册之后,它们才回收到事件(Events)通知。在Android中,Activities和Fragments通常根据它们的生命周期来绑定。
@Override
public void onStart() {
super.onStart();
EventBus.getDefault().register(this);
}
@Override
public void onStop() {
EventBus.getDefault().unregister(this);
super.onStop();
}
- 发送事件 从你的代码中任何位置发送事件,所有当前注册过的订阅者,只要事件类型匹配都能收到。
EventBus.getDefault().post(new MessageEvent("Hello everyone!"));