EventBus事件总线.以观察者模式实现,消息推送/订阅.用于Android组件之间相互通信。
(定义:针对事件提供统一订阅,发布以达到组件间通信的解决方案。 原理:观察者模式。发送者把消息发送到事件总线,然后事件总线在接收者中查找哪些方法注册了这个事件,如果某个方法注册了这个事件,就触发该方法。)。事件总线框架提供了一种更灵活更强大而又更加完美解耦的解决方案,在很多场合,从开发效率,执行性能和设计思路上都要优于BroadcastReceiver。
image官方工作原理截图如下:
image
android的应用场景,主要应用于组件间的通信,activity 、service、fragment、后台线程之间传递数据。
怎么使用:
gradle:compile'org.greenrobot:eventbus:3.1.1'
简单使用步骤:
1,定义事件类
事件类是通信过程中的数据的载体,用来传递数据,这里写一个最简单的事件类,后面说如何传递数据
public class MessageEvent {
}
2.注册事件
上面提到数据的发送者和接收者, 注册事件是针对接收者的, 哪个组件需要接收消息,就在哪个组件中去注册
注册:
EventBus.getDefault().register(this);
添加函数注解@Subscribe:当数据的发送者发出消息后,添加这个注解的函数会被调用
添加@Subscribe注解的函数参数,写上接收事件类型,表示这个组件会接收这类事件的消息
注销:
EventBus:EventBus.getDefault().unregister(this);
Note:一个事件是可以有多个接收者(订阅者)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
EventBus.getDefault().register(this);
}
@Subscribe
public void receiveMessage(MessageEvent messageEvent){
Log.i(TAG,"messageEvent");
}
@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
}
3.发送事件
发送事件@Subscribe注解的函数会被调用
EventBus.getDefault().post(newMessageEvent());
githup事例:
@Override
public void onStart() {
super.onStart();EventBus.getDefault().register(this);
}
@Override
public void onStop() {
super.onStop();EventBus.getDefault().unregister(this);
}
注意:注册和解除注册不应该写了这2个方法里,应写在onCreate onDestroy 函数中。
上面是EventBus的基本使用流程
android的具体用例:
-
在事件中传递数据
-
指定事件接收线程
-
发送黏性事件Sticky Events
-
接收事件的优先级别
-
中止事件传递
-
订阅者索引
** 传递数据:**
使用场景,如果个人中心更新用户头像,但是有的时候app首页展示用户头像,这个时候首页的用户头像应该刷新。
1、新定义一个事件:
public class UpdatePicEvent {
private StringpicUrl;
public StringgetPicUrl() {
return picUrl;
}
public void setPicUrl(String picUrl) {
this.picUrl = picUrl;
}
}
2、发送事件用新的自定义事件
//点击上传图片,server端返回url
UpdatePicEvent picEvent =new UpdatePicEvent();
picEvent.setPicUrl("http://xxx.com/20180725.png");
EventBus.getDefault().post(new UpdatePicEvent());
3.在接收消息的回调中用get方法去获取
@Subscribe
public void receiveMessage(UpdatePicEvent updatePicEvent){
Log.i(TAG,"url:"+updatePicEvent.getPicUrl());
}
指定事件接收的线程
@Subscribe注解,这个函数在消息推送之后会被回调,该注解有几个属性,threadMode能为该函数指定线程,如果不写,也会有个默认值:ThreadMode.POSTING,意思是和发送事件所在线程一样
ThreadMode列表
-
ThreadMode.POSTING:和发送事件在同一个线程
-
ThreadMode.MAIN:主线程
-
ThreadMode.BACKGROUND:子线程
-
ThreadMode.ASYNC:异步线程
发送黏性事件Sticky Events
上面事例情况是,发送者发送消息,订阅者立马收到消息,他会把消息推送给所有订阅者,如果你希望在消息推送完成之后,让新注册的订阅者也能收到这条消息,这时候你可以试试Sticky Events,达到需要配置2点
1.首先,发送的是黏性事件,代码将post改为postSticky
UpdatePicEvent picEvent =new UpdatePicEvent();
picEvent.setPicUrl("http://xxx.com/20180725.png");
EventBus.getDefault().postSticky(picEvent);
2.然后,订阅者要声明自己能够接收到黏性事件的消息:代码中@Subscribe注解中的sticky值为true
@Subscribe(sticky =true)
public void receiveMessage(UpdatePicEvent picEvent){
Log.e("chen","receiveMessage");
}
第二条消息和第一条消息有间隔5s
image接收事件的优先级别
EventBus可以定义接收事件方的优先级别,在@Subscribe注解中有一个priority的参数默认值是0,可以自行配置1.2.3.4...数值越大优先级越高,会越早收到消息,如果都是默认值0 谁先注册谁先收到消息
@Subscribe(priority =4)
public void receiveMessage(UpdatePicEvent picEvent){
Log.e("chen","GoodsDetailsActivity:"+picEvent.getPicUrl());
}
中止事件传递
类似于有序广播,优先级高的订阅者,可以终止事件向下传递,EventBus也提供了此功能
@Subscribe(priority =0)
public void receiveMessage(UpdatePicEvent updatePicEvent){
Log.e("chen","MainActivity:"+updatePicEvent.getPicUrl());
EventBus.getDefault().cancelEventDelivery(updatePicEvent);
}
网友评论