1、EventBus是什么东西?WHAT
一种事件的发布和订阅的机制,类似于观察者设计模式,是一种1对多的依赖关系,也就是说多个观察者可以同时监听一个主题对象,当主题对象发生变化时,会通知多个监听该主题对象的观察者。EventBus有事件的发布者和事件的订阅者,同时订阅者也可以是作为发布者,跟观察者模式类似,也是1对多的依赖关系。
2、为什么要使用使用TA,使用的意义在何处?WHY
EventBus能解决组建间的通讯问题,在实际开发过程中,在某些方面在多个组件间通讯使用广播,接口回调或者handler不太方便,例如...。只要事件发布者发布事件,订阅者事先订阅该事件,就可以在发布者事件发生改变时保证订阅者收到通知。
3、怎么使用EventBus?HOW
我自己入门的一个学习demo,大神勿喷。下面使用一个gif来演示以下demo:
大致功能描述:Activity中放置左右两个Fragment,这里没有做颜色的区分,可能不好看出。当点击click1,发布事件,由订阅事件
MessageEvent的ShowFragment#
onMessageEvent
去收到通知,然后做出UI的更新,点击click2一样道理,我这里也是使用ShowFragment订阅了该
SomeOtherEvent
因此在
ShowFragment#
handleSomethingElse
获取到通知,然后更新UI。
别BB了,开始看看如何使用:
使用步骤如下1,2,3step:
- Define events:
public class MessageEvent {//事件1
public final String message;
public MessageEvent(String message) {
this.message = message;
}
}
public class SomeOtherEvent {//事件2
public final String message;
public SomeOtherEvent(String message) {
this.message = message;
}
}
- Prepare subscribers
Register your subscriber (in your onCreate or in a constructor):eventBus.register(this);
订阅者代码:ShowFragment.java
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
EventBus.getDefault().register(this);//在fragment中注册
view = View.inflate(getActivity(), R.layout.layout_two, null);
text = (TextView) view.findViewById(R.id.text);
return view;
}
@Override
public void onDestroyView() {
super.onDestroyView();
EventBus.getDefault().unregister(this);//取消注册
}
订阅者代码:ShowFragment.java
@Subscribe
public void onMessageEvent(MessageEvent event) {
text.setText(event.message);
}
@Subscribe
public void handleSomethingElse(SomeOtherEvent event) {
text.setText(event.message);
}
订阅者收到事件通知,会调用这个两个方法。根据事件类型去调用指定事件的方法,方法开头都是on开头,并且需要使用 @Subscribe 注解 。 - Post events:发布事件
eventBus.post(event);
事件发布者代码:ListFragment:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
view = View.inflate(getActivity(), R.layout.layout_one, null);
Button click1 = (Button) view.findViewById(R.id.click1);
click1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {//点击按钮发布一个事件,订阅了当前事件的订阅者即可收到通知
EventBus.getDefault().post(new MessageEvent("Hello everyone MessageEvent!"));
}
});
Button click2 = (Button) view.findViewById(R.id.click2);
click2.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
EventBus.getDefault().post(
//点击按钮发布一个事件 ,订阅了当前事件的订阅者即可收到通知new SomeOtherEvent("Hello everyone SomeOtherEvent!"));
}
});
return view;
}