EventBus可以轻松实现跨组件、跨线程的数据通信,相对于传统四大组件之一的BroadcastReciver来说,使用更为方便、轻巧、代码的耦合性更低。
使用时需要引入依赖库:
implementation 'org.greenrobot:eventbus:3.1.1'
网上封装的例子有很多,此处使用注解的方式,先定义一个运行时的注解:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface BindEventBus {
}
在基类中添加使用的方法,并通过判断是否添加了注解,来确定是否调用注册的方法:
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 若使用BindEventBus注解,则绑定EventBus
if(this.getClass().isAnnotationPresent(BindEventBus.class)){
EventBusUtils.register(this); //必需要先注册
}
}
@Override
protected void onDestroy() {
super.onDestroy();
// 若使用BindEventBus注解,则解绑定EventBus
if(this.getClass().isAnnotationPresent(BindEventBus.class)){
EventBusUtils.unregister(this);//必须要解除注册,防止内存泄漏
}
}
对Event进行封装,Eventbus传递数据需要一个实体类对象,通过传递该对象来传递数据。如果不封装,那么每次传递数据都要重新创建一个实体类,来承载数据,这里固定封装好一个可以别处复用的,通过code来区分数据发送的主体,并可用于判断何处应该获取到相应的数据并处理。
public class Event<T> {
private int code;
private T data;
public Event(int code, T data) {
this.code = code;
this.data = data;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
}
发送消息的封装类,此处封装为了更加方便统一的调用:
public class EventBusUtils {
/**
* 绑定 接受者
* @param subscriber
*/
public static void register(Object subscriber) {
EventBus.getDefault().register(subscriber);
}
/**
* 解绑定
* @param subscriber
*/
public static void unregister(Object subscriber){
EventBus.getDefault().unregister(subscriber);
}
/**
* 发送消息(事件)
* @param event
*/
public static void sendEvent(Event event){
EventBus.getDefault().post(event);
}
/**
* 发送 粘性 事件
*
* 粘性事件,在注册之前便把事件发生出去,等到注册之后便会收到最近发送的粘性事件(必须匹配)
* 注意:只会接收到最近发送的一次粘性事件,之前的会接受不到。
* @param event
*/
public static void sendStickyEvent(Event event){
EventBus.getDefault().postSticky(event);
}
}
//使用时需要用EventBusUtils来发送你要传递的数据,此处只用调用方法发送即可(ABC为承载数据的实体类)。如下:
Event<ABC> event=new Event<>(0,new ABC());
EventBusUtils.sendEvent(event);
接收时,在接收处的类上加上前面定义的注解,然后写个接收方法,方法名可以随意。但是一定要在方法名上加上一个注解。具体如下:
@BindEventBus
public class ABCActivity extends BaseActivity {
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
//方法名可以随意,但是一定要加上@Subscribe注解,并指定线程
@Subscribe(threadMode = ThreadMode.MAIN)
public void handleEvent(Event<ABC> event){
// do something
}
}
至此,封装及使用完成。Enjoy it!
感谢:
https://blog.youkuaiyun.com/jiashuai94/article/details/79725755
https://www.jianshu.com/p/bf5c431872bf