EventBus的使用量据说已经破亿,如此受欢迎的三方库我们有必要去掌握它。其是基于发布/订阅的模式,用来进行通讯,比如在子线程中下载完数据通知主线程更新UI、Activity与fragment之间通信等等。其直接使用java类来实现,不同于Broadcast、Intent等Android原生的事件通知在于使用简便开销少,不需要使用使用Extra来传递数据。Eventbus的工作原理是这样的:在需要收消息的类里注册事件并且重写4个事件处理方法中的一个(也可以多个)然后不需要的时候解注册,在需要发消息的地方使用post发送消息,这样程序在运行的时候Eventbus就会使用反射机制拿到重写的方法,如果方法的参数对应就执行这个方法,如果有多个方法参数对应就执行多个。下面来正式介绍其的使用。
导入jar包就不需要多说了吧,我这里提供jar包:jar包下载
使用步骤:
1、在需要收听的类注册事件,在不需要的地方解注册并且重写4个事件处理方式中需要的。
2、新建一个类用来作为消息的载体类似于handler里面的Message作用。
3、在需要发送消息的地方使用post发送消息。
对的使用就是这么简单,那么代码多吗??代码更简单,先来看这么注册:
// 注册事件
EventBus.getDefault().register(this);
两个参数的重载方法,第一个为需要注册的类,第二个为优先级。registerSticky为粘性的注册,发送消息也需要使用postSticky().所谓粘性是指消息的接受者在消息发送之后才注册也可以收到消息的情况。
再看看怎么解注册: @Override
protected void onDestroy() {
super.onDestroy();
// 解注册
EventBus.getDefault().unregister(this);
}
如何重写处理消息函数(总共就这4个,根据需要重写其中的一部分):
// 重写消息处理函数
public void onEventMainThread(EventMessage msg) {
Log.e("onEventMainThread", msg.getI() + "," + msg.getMsg());
}
public void onEvent(EventMessage msg) {
Log.e("onEvent", msg.getI() + "," + msg.getMsg());
}
public void onEventBackgroundThread(EventMessage msg) {
Log.e("onEventBackGroud", msg.getI() + "," + msg.getMsg());
}
public void onEventAsync(EventMessage msg) {
Log.e("onEventAsync", msg.getI() + "," + msg.getMsg());
}
千万不要把函数名字写错哦,不然会报错,那么他们之间有什么区别呢?
onEvent:事件在哪个线程发布onEvent就运行在哪个线程。
onEventMainThread:不管线程在哪个线程发布处理函数都运行在主线程。
onEventBackground:如果发布线程在主线程处理函数就运行在子线程,如果发布在子线程处理函数就运行在改线程。
onEventAsync:不管发布在哪个线程都运行在子线程中。
再来看看如何发送消息:
//发送消息
EventBus.getDefault().post(new EventMessage(5));
也可以使用postSticky()发送。
消息载体的实体类:
public class EventMessage {
private int i;
private String msg;
public int getI() {
return i;
}
public void setI(int i) {
this.i = i;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public EventMessage(String msg) {
super();
this.msg = msg;
}
public EventMessage(int i) {
super();
this.i = i;
}
}
扫描关注我的微信公众号:
最后附上Demo:demo下载