官网镇楼
https://github.com/greenrobot/EventBus
http://greenrobot.org/eventbus/documentation/how-to-get-started/
参照官网三部曲使用
1 定义事件
定义事件,简单传入一个字符串
public class MessageEvent {
public final String message;
public MessageEvent(String message) {
this.message = message;
}
}}
2 初始化订阅者
官网示例:
首先注册与反注册,
@Override
public void onStart() {
super.onStart();
EventBus.getDefault().register(this);
}
@Override
public void onStop() {
EventBus.getDefault().unregister(this);
super.onStop();
}
然后处理事件,可以处理多个事件,根据事件类型来区分
// 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);
}
3 发送事件
在需要的地方发送事件
EventBus.getDefault().post(new MessageEvent("Hello everyone!"));
这样,基本使用就OK了。
写个Demo学习下
在 MainActivity 中写三个按钮,分别是 注册、打开应用、反注册。
MainActivity 代码示例
public class MainActivity extends AppCompatActivity {
private Button register, start, unregister;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private void initView() {
register = findViewById(R.id.btn_register);
unregister = findViewById(R.id.btn_unregister);
start = findViewById(R.id.btn_start);
}
public void onRegister(View view) {
EventBus.getDefault().register(MainActivity.this);
}
public void onStartActivity(View view) {
startActivity(new Intent(MainActivity.this, EventActivity.class));
}
public void onUnregister(View view) {
EventBus.getDefault().unregister(MainActivity.this);
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void onGetMyEvent(MyEvent myEvent) {
Log.d("luoah", "[MainActivity.java] -- onGetMyMessage -- myEvent:" + myEvent.getMessage());
}
@Subscribe(threadMode = ThreadMode.MAIN, priority = 1)
public void onGetMyEventpriority(MyEvent myEvent) {
Log.d("luoah", "[MainActivity.java] -- onGetMyEventpriority -- myEvent:" + myEvent.getMessage());
}
@Subscribe(sticky = true)
public void onGetStickyMyEvent(MyEvent stickyMyEvent) {
Log.d("luoah", "[MainActivity.java] -- onGetStickyMyEvent -- myEvent:" + stickyMyEvent.getMessage());
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void onGetNewEvent(NewEvent newEvent) {
Log.d("luoah", "[MainActivity.java] -- onGetNewEvent -- newEvent:" + newEvent.toString());
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void onGetString(String string) {
Log.d("luoah", "[MainActivity.java] -- onGetMyMessage -- string:" + string);
}
@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
}
}
EventActivity 中添加4个 Button 发送不同的事件
EventActivity 代码示例:
public class EventActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_myevent);
}
public void onPostMyEvent(View view){
EventBus.getDefault().post(new MyEvent("I am MyEvent"));
}
public void onPostNewEvent(View view){
EventBus.getDefault().post(new NewEvent((int) 100 , "I am NewEvent"));
}
public void onPostString(View view){
String string = "I am String";
EventBus.getDefault().post(string);
}
public void onPostStickyEvent(View view){
EventBus.getDefault().postSticky(new MyEvent("I am sticky MyEvent"));
}
}
MyEvent :
public class MyEvent {
private String message;
public MyEvent(String message) {
this.message = message;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
NewEvent :
public class NewEvent {
private int id;
private String content;
public NewEvent(int id, String content) {
this.id = id;
this.content = content;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
@Override
public String toString() {
return "id:" + id + "_content:" + content;
//return super.toString();
}
}
普通事件
如果 MainActivity 中没有注册,直接打开 EventActivity 执行 PostMyEvent 、PostNewEvent 、PostString ,MainActivity 是收不到事件的。
发送事件后再回到 MainActivity 注册,PostStickyEvent 收的到,其他的收不到。为什么?因为PostStickyEvent 可以接收粘性事件,后面说。
注册后打开 EventActivity ,
PostMyEvent ,log 如下
D/luoah: [MainActivity.java] -- onGetMyEventpriority -- myEvent:I am MyEvent
D/luoah: [MainActivity.java] -- onGetMyMessage -- myEvent:I am MyEvent
D/luoah: [MainActivity.java] -- onGetStickyMyEvent -- myEvent:I am MyEvent
分析:
@Subscribe(threadMode = ThreadMode.MAIN, priority = 1)
onGetMyEventpriority
使用注解说明在主进程接收事件,方便UI刷新。
指定了优先级为 1 ,未指定优先级默认是 0 ,这样,就优先于 onGetMyMessage
收到事件。
onGetStickyMyEvent
虽然指明了接收粘性事件,它依旧可以接收普通事件。
因为发送的事件内容是 MyEvent ,所以其他方法收不到事件,这样就区分开了事件类型。
PostNewEvent ,log 如下
D/luoah: [MainActivity.java] -- onGetNewEvent -- newEvent:id:100_content:I am NewEvent
PostString ,log 如下
D/luoah: [MainActivity.java] -- onGetMyMessage -- string:I am String
PostStickyEvent, log如下
D/luoah: [MainActivity.java] -- onGetMyEventpriority -- myEvent:I am sticky MyEvent
D/luoah: [MainActivity.java] -- onGetMyMessage -- myEvent:I am sticky MyEvent
D/luoah: [MainActivity.java] -- onGetStickyMyEvent -- myEvent:I am sticky MyEvent
粘性事件
前面说的未注册直接发送事件,订阅方是收不到事件的。
但粘性事件除外,粘性事件可以先发送,再注册,注册后是可以收到事件。
怎么接收粘性事件呢? 很简单,使用 @Subscribe(sticky = true)
就可以了
@Subscribe(sticky = true)
public void onGetStickyMyEvent(MyEvent stickyMyEvent) {
Log.d("luoah", "[MainActivity.java] -- onGetStickyMyEvent -- myEvent:" + stickyMyEvent.getMessage());
}
先不注册,直接打开 EventActivity , PostStickyEvent ,
然后回到 MainActivity 并 注册, log 如下
D/luoah: [MainActivity.java] -- onGetStickyMyEvent -- myEvent:I am sticky MyEvent
粘性广播只能收到最近一次的事件,比如,修改 PostStickyEvent 为
EventBus.getDefault().postSticky(new MyEvent("I am sticky MyEvent 1"));
EventBus.getDefault().postSticky(new MyEvent("I am sticky MyEvent 2"));
然后进行操作 先不注册,直接打开 EventActivity , PostStickyEvent ,回到 MainActivity 并注册,log 如下
D/luoah: [MainActivity.java] -- onGetStickyMyEvent -- myEvent:I am sticky MyEvent 2