1、EventBus三方框架运用广泛,是Android端优化的publish/subscribe消息总栈,简化了应用程序内各组件间、组件与后台线程间的通信,比如请求网络,等网络返回时通过Handler或者Broadcast通知UI,两个Fragment之间需要通过Listener通信,这些需求都可以通过EventBus实现;
2、EventBus使用步骤:
a在app项目的build.gradle中添加三方库:
implementation 'org.greenrobot:eventbus:3.0.0'
在注册EventBus之前有个通用EventBusUtils工具类,可以直接使用:
package com.example.myapp.utils;
import org.greenrobot.eventbus.EventBus;
public class EventBusUtils {
public static void register(Object o){
if(!EventBus.getDefault().isRegistered(o)){//加上判断
EventBus.getDefault().register(o);
}
}
public static void unregister(Object o){
if(EventBus.getDefault().isRegistered(o)) {//加上判断
EventBus.getDefault().unregister(o);
}
}
public static void post(Object o){
EventBus.getDefault().post(o);
}
}
b注册EventBus
在BaseActivity.java类中OnCreate方法中进行注册
// 注册EventBus
EventBusUtils.register(MainActivity.this);
c反注册EventBus
在BaseActivity.java类中OnDestory方法中进行反注册
// 反注册EventBus
EventBusUtils.unregister(this);
d构造发送消息的类(可以理解为bean对象)
写出get和set方法,还有带有参数的构造函数
package com.example.myapp.event;
import java.io.Serializable;
/**
* Created by mike.
* Created on 2020/3/9.
*/
public class MessageEvent implements Serializable {
private static final long serialVersionUID = 8578568521489221892L;
private String name;
public MessageEvent(String name) {
this.name = name;
}
@Override
public String toString() {
return "MessageEvent{" +
"name='" + name + '\'' +
'}';
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
e注意的是注册和反注册,还有接收消息是在同一个界面中
接收消息需要添加订阅注解,并且是运行在主线程中
// 接收消息
@Subscribe(threadMode = ThreadMode.MAIN)
public void MessageEventBus(MessageEvent messageEvent){
// 接收到消息
String name = messageEvent.getName();
}
d发送消息是在第二个页面
通过
EventBusUtils.post(new MessageEvent("主线程发送过来的数据"));
进行发送消息,并且需要finish当前页面,此时,在第一个页面中就能接收到第二个页面发送过来的消息,在第一个页面中对返回过来的数据进行处理;