前言
EventBus是一种用于Android的发布/订阅事件总线。它有很多优点:简化应用组件间的通信;解耦事件的发送者和接收者;避免复杂和容易出错的依赖和生命周期的问题;很快,专门为高性能优化过等等。
activity之间的跳转传值、activity和fragment的传值、fragment之间的传值 如果再有viewpager 那得写多少个intent和bundle 想想就觉得恶心
在这里直接使用 EventBus3.0粘性事件
注册:EventBus.getDefault().register(obj);
取消注册:EventBus.getDefault().unregister(obj);
传的是obj对象(this) 而不是context
Activity中
- 第一步:
* eventBus------定义消息事件类
*
* 第一步:定义事件
*/
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;
}
}
- 第二步 在要传值的activity 发布黏性事件
@OnClick(R.id.bt_message)
public void onViewClicked() {
//事件发布者发布事件
EventBus.getDefault().postSticky(new MessageEvent("Hello EventBus!!!!"));
Intent intent = new Intent(this, EventBusActivity2.class);
startActivity(intent);
}
- 第三步 在要接受传值的activity 订阅事件 前提要注册 取消注册
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.eventbus);
ButterKnife.bind(this);
btMessage.setText("返回EventBusActivity");
//订阅者还需要在总线上注册,并在不需要时在总线上注销
EventBus.getDefault().register(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
//订阅注销
EventBus.getDefault().unregister(this);
}
@Subscribe(threadMode = ThreadMode.POSTING, sticky = true)
public void ononMoonStickyEvent(MessageEvent messageEvent) {
tvMessage.setText(messageEvent.getMessage());
}
ThreadMode.POSTING:在和发送事件相同的线程中执行。默认的线程模式
ThreadMode.MAIN:Android的UI线程中执行。
Fragment 中
- 传的是obj对象(this) 而不是context
取消注册:EventBus.getDefault().unregister(obj);
- 在EventBus初始化中,register()方法传入的是一个Object,而不必须是Context,如果将基类的Context传入,就会导致应用直接崩溃,报错如下
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.sdhmw.dtwb2/com.sdhmw.dtwb2.main.JyActivity}: org.greenrobot.eventbus.EventBusException: Subscriber class com.sdhmw.dtwb2.main.JyActivity and its super classes have no public methods with the @Subscribe annotation