EventBus 消息通信机制在项目开发中的使用

实现组件之间的消息通信有很多种方式,比如,利用Handle 实现消息的异步通信;这个后面一章会讲到,今天主要总结一下EventBus 在实际项目中的应用;通过消息的发布和订阅模式实现不同组件之前的通信机制;

在开始使用EventBus 之前,先来了解一下EventBus 相关的四个订阅函数:
1、onEvent
2、onEventMainThread
3、onEventBackgroundThread
4、onEventAsync

1 onEvent
2.onEventMainThread
3.onEventBackgroundThread
4. onEventAsync

**onEvent:如果使用onEvent作为订阅函数,那么该事件在哪个线程发布出来的,onEvent就会在这个线程中运行,也就是说发布事件和接收事件线程在同一个线程。使用这个方法时,在onEvent方法中不能执行耗时操作,如果执行耗时操作容易导致事件分发延迟。
onEventMainThread:如果使用onEventMainThread作为订阅函数,那么不论事件是在哪个线程中发布出来的,onEventMainThread都会在UI线程中执行,接收事件就会在UI线程中运行,这个在Android中是非常有用的,因为在Android中只能在UI线程中跟新UI,所以在onEvnetMainThread方法中是不能执行耗时操作的。
onEventBackground:如果使用onEventBackgrond作为订阅函数,那么如果事件是在UI线程中发布出来的,那么onEventBackground就会在子线程中运行,如果事件本来就是子线程中发布出来的,那么onEventBackground函数直接在该子线程中执行。
onEventAsync:使用这个函数作为订阅函数,那么无论事件在哪个线程发布,都会创建新的子线程在执行onEventAsync.**
EventBus 可以实现在不同Activity,fragment 之前实现通信;发送消息,接受消息,通常我们再更新UI 界面,处理页面显示时会用到。
使用方法:
先创建BaseEventMessage 类

package com.xinsheng.kuaijiexiaodai.ui.base;

import android.support.annotation.NonNull;
/**
 * Created by:andy
 * ClassName:BaseEventMessage
 * Date:2018/1/4 17:16
 * Description: EventBus 消息通信
 */

public class BaseEventMessage<T> {
    public String type;
    public T data;

    public BaseEventMessage(@NonNull String type, T data) {
        this.type = type;
        this.data = data;
    }
}

要在哪个界面使用,就要先在这个界面里注册监听;for example:在Activity 中使用;

注册:onCreate()生命周期里注册监听,

 EventBus.getDefault().register(this);

注销监听:

   @Override
    protected void onDestroy() {
        super.onDestroy();
        EventBus.getDefault().unregister(this);
    }

消息发送方:

   EventBus.getDefault().post(new BaseEventMessage<String>("authFlag", "success"));

监听消息:

在需要接受消息的页面也同样进行注册,注销操作;
此处需要注意的是:消息的type 和data 一致时才能接收到消息,否则无法实现通信.BaseEventMessage<> 本身就是一个泛型;type 为消息类型,,type 可以为String ,Int, double ,对象类型等等。data 为 传递过来的数据;
注意:

注意:在实际项目开发中我们经常会在同一个界面里,接受和处理来自多个界面的消息,此时,我们通常是在post 消息的时候,通过消息的type 加以区别; 然后在接收监听消息的界面中,对消息类型分别判断即可;

 @Subscribe(threadMode = ThreadMode.MAIN)
    public void onEventMainThread(BaseEventMessage<String> message) {
        LogUtil.i("BaseEventMessage"+message.data);
        if (message.type.equals("authFlag")) {
        // 开始执行相应的操作,比如说请求网络,更新UI,等等.....
            getAuthenticationInfo();
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值