* 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傳遞的數據都定義一個事件對象來封裝,并且將所有事件都放在同一包下。項目中已定義的事件如下圖所示:
