EventBus可以进行发布-订阅消息,使用它可以实现组件之间的通信。本文主要介绍:“导入EventBus依赖”、“组件注册EventBus”、“组件向EventBus发布信息”、“组件接收EventBus的信息”、“组件取消注册EventBus”。
1、导入EventBus依赖。
在build.gradle(app)导入EventBus依赖:
// eventbus
implementation "org.greenrobot:eventbus:$eventBusVersion"
2、组件注册EventBus。
组件在onCreate方法注册EventBus:
EventBus.getDefault().register(this);
3、组件向EventBus发布信息。
以Login1Activity组件为例,它注册了EventBus,员工在POS收银机进行登录操作。
先设置eventID来区分不同组件发出的请求,便于后续的区分和处理:
if (staffLoginHttpEvent == null) {
staffLoginHttpEvent = new StaffLoginHttpEvent();
staffLoginHttpEvent.setId(BaseEvent.EVENT_ID_LoginActivity);
}
if (staffLoginHttpBO == null) {
staffLoginHttpBO = new StaffLoginHttpBO(GlobalController.getInstance().getContext(), null, staffLoginHttpEvent);
}
staffLoginHttpEvent.setHttpBO(staffLoginHttpBO);
发送http请求:
staffLoginHttpBO.loginAsync();
调用了StaffLoginHttpBO的doLoginAsync的方法,向服务器发送请求:
/**
* 先get token后login
* 本函数阻塞线程
*/
@Override
protected void doLoginAsync() {
log.info("正在执行StaffLoginHttpBO的doLoginAsync");
try {
//currentStaff getToken
RequestBody body = new FormBody.Builder()
.add((staff.getIsBXStaff() == 0 ? staff.field.getFIELD_NAME_phone() : staff.mobile), staff.getPhone())
.build();
Request request = new Request.Builder()
.url(Configuration.HTTP_IP + (staff.getIsBXStaff() == 0 ? staff.HTTP_STAFF_getToken : staff.HTTP_BXSTAFF_getToken))
.addHeader(BaseHttpBO.COOKIE, GlobalController.getInstance().getSessionID())
.post(body)
.build();
httpEvent.setEventProcessed(false);
httpEvent.setStatus(BaseEvent.EnumEventStatus.EES_Http_ToDo);
HttpRequestUnit hru1 = new StaffGetToken();
hru1.setRequest(request);
hru1.setTimeout(TIME_OUT);
hru1.setbPostEventToUI(true);
hru1.setEvent(httpEvent);
HttpRequestManager.getCache(HttpRequestManager.EnumDomainType.EDT_Communication).pushHttpRequest(hru1);
……
请求成功后,服务器返回信息,在HttpRequestUnit 类的onResponse方法接收,向eventBus发送了一个消息,携带StaffLoginHttpEvent对象EventBus.getDefault().post(event):
@Override
public void onResponse(Call call, Response response) throws IOException {
log.info("请求后返回的response:" + response);
dateEnd = new Date(System.currentTimeMillis() + NtpHttpBO.TimeDifference);
if (isTimeout(call)) {
event.setLastErrorCode(ErrorInfo.EnumErrorCode.EC_Timeout);
return;
}
log.info(" Http onResponse,收到服务器的响应");
if (NtpHttpBO.bForNtpOnly) {// 在同步的时候设置POS接收到答复的时间,用于POS机与服务器同步时间
event.setData(new Date(System.currentTimeMillis() + NtpHttpBO.TimeDifference).getTime());
NtpHttpBO.bForNtpOnly = false;
}
event.setLastErrorCode(ErrorInfo.EnumErrorCode.EC_NoError);
if (bPostEventToUI) {
event.setRequestType(getEnumRequestType());
event.setResponseData(response.body().string());
event.setResponse(response);
//...设置Event状态???
EventBus.getDefault().post(event);
}
}
4、组件接收EventBus的信息。
Login1Activity已经向EventBus进行了注册,并且编写了有org.greenrobot.eventbus .Subscribe注解的方法。那么EventBus发布了有StaffLoginHttpEvent对象的信息时,onStaffLoginHttpEvent方法就会接收到。StaffLoginHttpEvent对象设置了ID,可以根据该ID判断是否是Login1Activity组件发出的请求。
@Subscribe(threadMode = ThreadMode.ASYNC)
public void onStaffLoginHttpEvent(StaffLoginHttpEvent event) {
if (event.getId() == BaseEvent.EVENT_ID_LoginActivity) {
event.onEvent();
if (event.getRequestType() == HttpRequestUnit.EnumRequestType.ERT_StaffGetToken) {
return;
}
if (Staff.LOGIN_SUCCESS.equals(event.getStaffLoginStatus())) {
event.setStaffLoginStatus("");
Message message1 = new Message();
message1.what = 3;
handler.sendMessage(message1);
} else if (Staff.LOGIN_FAILURE.equals(event.getStaffLoginStatus())) {
……
5、组件取消注册EventBus。
在onDestroy方法取消注册EventBus:
@Override
public void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
dismissLoading();
if (BuildConfig.DEBUG) {
ViewServer.get(getContext()).removeWindow(getActivity()); // 使得真机也能使用HierarchyViewer 工具
}
// ActivityController.removeActivity(getActivity());
}