实现组件之间的消息通信有很多种方式,比如,利用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();
}
}