1, EventBus概述
EventBus是一款针对Android优化的发布/订阅事件总线。主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,线程之间传递消息.优点是开销小,代码更优雅。以及将发送者和接收者解耦。只能用于进程内部,线程间的通信,有点类似于观察者模式。
下载EventBus的类库,源码:https://github.com/greenrobot/EventBus
基本使用方法:
1,注册和取消注册
一般在组件的onCreate方法里面注册
EventBus.getDefault().register(this);
在onDestroy方法里面取消注册
EventBus.getDefault().unregister(this);
2,在利用EventBus发送消息之前自己可以定义一个类,例如
public class BluetoothConnectMessages {
public boolean BLUETOOTHWAR_MESSAGE_CONNECT = true;
public Object BLUETOOTHWAR_MESSAGE_CONNECT_READ_OBJECT = null;
}
3,在另一个组件中发送消息利用EventBus发送消息
private BluetoothConnectMessages bluetoothConnectMessages;
bluetoothConnectMessages.BLUETOOTHWAR_MESSAGE_CONNECT = true;
EventBus.getDefault().post(bluetoothConnectMessages);
4,在注册的组件中接收并处理消息
public void onEventMainThread(BluetoothConnectMessages message) {
if (!message.BLUETOOTHWAR_MESSAGE_CONNECT) {
chatEditText.setText("连接失败");
} else {
serversText.setText("连接成功");
}
}
看过这些,就可以简单的使用EventBus了。
2, EventBus详细说明
接收消息的方法不是仅有onEventMainThread一个,而是有4个,那么有什么不同呢?
onEvent:该事件在哪个线程发布出来的,该方法就会在这个线程中运行,也就是说发布事件和接收事件线程在同一个线程。使用这个方法时,在onEvent方法中不能执行耗时操作,如果执行耗时操作容易导致事件分发延迟,这个不常用。
onEventMainThread:不论事件是在哪个线程中发布出来的,该方法都会在UI线程中执行,接收事件就会在UI线程中运行,这个方法很常用,因为在Android中只能在UI线程中跟新UI,所以在onEvnetMainThread方法中是不能执行耗时操作的。
onEventBackground:如果事件是在UI线程中发布出来的,那么onEventBackground就会在子线程中运行,如果事件本来就是子线程中发布出来的,那么onEventBackground函数直接在该子线程中执行。
onEventAsync:使用这个函数作为订阅函数,那么无论事件在哪个线程发布,都会创建新的子线程在执行onEventAsync.
EventBus消息接收原则:
1,一个组件发出的消息,只要是注册的组件都有可能接收到该消息。也就是说一个组件发送消息,可以有多于一个组件接收并且处理该消息。
2,如果发送消息时的参数是A类的实例,那么仅有接收消息的参数是A类的实例才能接收该消息。比如,上小节中,发送的是bluetoothConnectMessages消息,而bluetoothConnectMessages是BluetoothConnectMessages的实例,那么onEventMainThread方法中的参数也是
BluetoothConnectMessages实例才可以接收。
3,接收消息的方法有4个,同一个组件中可以有不止一个方法会收到消息并且处理消息。比如, onEvent和onEventMainThread可以同时接收到同一个消息。