Otto 一个事件总线,可以替代Intent、Handler和BroadcastReceiver 在四大组件之间传递消息,而且开销极小,同时能让我们的代码更加优雅,还有一个大大的好处就是可以将消息发送者和接收者解耦 。
基本用法
1. 根据实际需求定义事件
/**
* Created by dell on 2016/9/12.
*
* 定义事件
*
* 所有能被实例化为 Object 的实例都可以作为事件
* eventbus 3中如果用到了索引加速,事件类的修饰符必须为 public
*/
public class MessageEvent {
private String message;
public MessageEvent(String message) {
this.message = message;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
2. 创建bus单利
创建一个类,在整个应用程序范围内持有一个总线对象。(使用EventBus不需要这一步,因为EventBus已近替我们实现好了默认的单例对象)
/**
* Created by dell on 2016/9/12.
*/
public class BusProvider {
/**
*
* 它代表一条总线,实际使用中最好作为一个单例依赖。
* 默认值在主线程执行
*/
private static Bus buss = new Bus();
public static Bus getBuss(){
return buss;
}
private BusProvider(){
}
}
3. 注册
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
/**
* 注册目标组件,让总线得到这个目标中的发布者和订阅者
*/
BusProvider.getBuss().register(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
BusProvider.getBuss().unregister(this);
}
4.订阅
/**
*
* 订阅一个事件只需要定义一个方法,标记@Subscribe注解
* 这个方法就是一个订阅者,该方法只能有一个参数,参数类型即为订阅的事件类型
* @Subscribe 注解告诉Bus 这个函数订阅了一个事件 ,事件的类型是函数的参数
* @param event
*/
@com.squareup.otto.Subscribe
public void handleOtto(MessageEvent event) {
tvOtto.setText(event.getMessage());
}
5. 事件发布 ,有两种方式
5.1 一种是不使用@Produce标注 ,直接调用bus的post方法 。这种方式被otto官方文档称为PUBLISHING 。
@OnClick(R.id.btn_otto)
public void onOttoClick() {
MessageEvent event = new MessageEvent("Otto 返回来的消息");
/**
* 任何一个类的实现都可以作为 事件发送到总线上
* 调用POST方法 发布一个事件
*/
BusProvider.getBuss().post(event);
finish();
}
5.2 另一种是使用@Produce标注,这种方式被otto官方文档称为PRODUCING。
/**
*
* 按照这种方式显示定义了生产者之后,之前在此bus上注册过的所有该类型事件的订阅者都会接收到本事件的实例。
* 之后再再此bus上注册的此类型的新的订阅者同样能够接收到本事件实例。
* @Produce 注解告诉bus
* 这是一个事件产生者,产生的事件类型是函数的返回值
* @Produce 也是用于方法,并且这个方法的参数必须为空,返回值是你要订阅的事件的类型
* @return
*/
@Produce
public MessageEvent postEvent(){
return new MessageEvent("Otto Produce 返回来的消息");
}