* EventBus是一款针对Android优化的发布/订阅事件总线。以观察者模式实现,用于简化程序的组件、线程通信,可以轻易切换线程、开辟线程。在APP的项目中,大量使用了EventBus进行Android组件间的数据传递。
以识别动画刷新事件为例:
1. 发送事件
~~~
//开始识别时,发送RecordUpdateEvent.RECORDING
EventBus.getDefault().post(new RecordUpdateEvent(RecordUpdateEvent.RECORDING));
//刚结束说话,讯飞仍未返回识别结果时,发送RecordUpdateEvent.RECOGNIZING
EventBus.getDefault().post(new RecordUpdateEvent(RecordUpdateEvent.RECOGNIZING));
//识别结束,发送RECORD_IDLE_AFTER_RECOGNIZED
EventBus.getDefault().post(new RecordUpdateEvent(RecordUpdateEvent.RECORD_IDLE_AFTER_RECOGNIZED));
~~~
2. 接收事件(此处是在VoiceInputFragment接收,还有其他地方接收该事件)
~~~
//处理识别动画刷新事件
public void onRecordUpdate(RecordUpdateEvent e){
switch (e.getState()) {
case RecordUpdateEvent.RECORD_IDLE:
case RecordUpdateEvent.RECORD_IDLE_AFTER_RECOGNIZED:
voiceBt.setRecordIdleState();
mFbviTextInputBt.setVisibility(View.VISIBLE);
mFvbiManualBt.setVisibility(View.VISIBLE);
break;
case RecordUpdateEvent.RECORDING:
((MainActivity) getActivity()).closeSlidingMenu();
((MainActivity) getActivity()).scroll2LastPosition();
//判断是否展示话筒的波纹效果
boolean isShow = AppConfig.dPreferences.getBoolean("wave_show", true);
if (isShow) {
mFbviTextInputBt.setVisibility(View.GONE);
mFvbiManualBt.setVisibility(View.GONE);
voiceBt.setRecordStartState();
}
break;
case RecordUpdateEvent.RECOGNIZING:
voiceBt.setRecognizeCompletedState();
break;
}
}
~~~
* 由于EventBus强解耦的特性,对数据的发送和接收都较难维护管理。因此在项目中,需要使用EventBus传递的数据都定义一个事件对象来封装,并且将所有事件都放在同一包下。项目中已定义的事件如下图所示:
![](https://box.kancloud.cn/ae7e697a9430e6efa665b41a3f1256fb_335x782.png)