Java实现客户端组件间的通信

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());
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值