版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
EventBus https://github.com/greenrobot/EventBus
手动敲代码实现一下eventbus的注册事件、发布消息、接收消息、注销事件订阅,有助于理解
下面以loginActivity(注册事件、接收消息、注销事件)、PostMessageActivity(发布消息)为例,按顺序进行讲解
一.在build.gradle引入:版本号可以在github找最新的
implementation 'org.greenrobot:eventbus:3.0.0'
二:自定义消息事件
public class MessageEvent {
private int message;
private Object obj;
public MessageEvent(int message) {
this.message = message;
}
public MessageEvent(Object obj) {
this.obj = obj;
}
public MessageEvent(int message, Object obj) {
this.message = message;
this.obj = obj;
}
public int getMessage() {
return message;
}
public void setMessage(int message) {
this.message = message;
}
public Object getObj() {
return obj;
}
public void setObj(Object obj) {
this.obj = obj;
}
}
三.loginActivity中:注册事件
切记,在未注销事件订阅情况下只能注册一次,onDestroy里进行注销,后面会讲
EventBus.getDefault().register(this);//注册事件,切记,在未注销情况下只能注册一次,onDestroy里进行注销,后面会将
四.PostMessageActivity中(loginActivity已“注册事件”后跳转到PostMessageActivity):发送消息(发送后finishActivity当前activity)
mBinding.edPostMessage.getText().toString()是获取界面输入框内容
EventBus.getDefault().post(new MessageEvent(mBinding.edPostMessage.getText().toString()));
五.loginActivity中:接收消息(把三发送的消息显示在文本上进行验证)
@Subscribe(threadMode = ThreadMode.MAIN)
public void onGetMessage(MessageEvent message) {
mBinding.tvLoginEventBus.setText("EventBus发送的消息是:" + message.getObj());
}
六.loginActivity的onDestroy中(一般放在onDestroy,也可以手动注销):注销事件订阅
@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
}
上面三四顺序调换一下,即先发布消息再注册,就会接收不到消息了
粘性事件:解决发布了消息再订阅,收不到消息的问题(其它的顺序操作一样)
三.PostMessageActivity:发布粘性事件 (用postSticky)
EventBus.getDefault().postSticky(new MessageEvent(mBinding.edPostSticky.getText().toString()));
四.loginActivity:注册(PostMessageActivity发布粘性消息后,才进行注册)
EventBus.getDefault().register(this);//注册事件,切记,在未注销情况下只能注册一次,onDestroy里进行注销,后面会将
五. loginActivity:接收粘性消息(注意onGetStickyEvent和注解)
@Subscribe(threadMode = ThreadMode.MAIN, sticky = true)
public void onGetStickyEvent(MessageEvent message) {
mBinding.tvLoginEventBusSticky.setText("EventBus粘性事件:" + message.getObj());
}