前篇文章我們簡短地介紹了事件驅動程式設計。現在我們看下EventBus中進行這些基本操作的例項程式碼。
首先,我將展示事件驅動程式設計中扮演中心角色的實體。參考從EventBus倉庫中取得的圖片。
一個事件匯流排(Event Bus)。這是連線其他實體的中心通訊通道。
一個事件(Event)。這是發生的動作,字面上可以是任何東西(應用啟動,收到資料,使用者互動…)。
一個訂閱者。訂閱者監聽事件匯流排。如果檢測到事件發生,它將會觸發。
一個釋出者,將事件傳送到事件匯流排。
有程式碼有真相,下面看下一個簡單例子:
- 應用載入兩個fragment。
- 第二個片段包含一個TextView,按鈕點選時將會更新。
- 新的Fragment加到場景中時,ActionBar標題會變化。
宿主Activity
宿主Activity需要在onCreate方法中註冊EventBus。
1 |
EventBus.getDefault().register(this); |
宿主Activity現在準備好從匯流排中讀取資料了。我們也需要在onDestroy方法中登出匯流排。
1 |
EventBus.getDefault().unregister(this); |
Activity可以捕獲兩種不同事件:一個更新ActionBar標題,另一個載入第一個fragment。我們寫兩個onEvent來處理事件:
1 2 3 4 5 6 |
public void onEvent(ShowFragmentEvent event) { getFragmentManager().beginTransaction().replace(R.id.container, event.getFragment()).addToBackStack(null).commit(); } public void onEvent(UpdateActionBarTitleEvent e) { getActionBar().setTitle(e.getTitle()); } |
事件
每個事件都需要在類中宣告。事件中可以包含變數。
1 2 3 4 5 6 7 8 9 |
public final class ShowFragmentEvent { private Fragment fragment; public ShowFragmentEvent(Fragment fragment) { this.fragment = fragment; } public Fragment getFragment() { return fragment; } } |
碎片
現在我們需要建立fragment。第一個fragment包含一個按鈕,可以開啟第二個;第二個包含一個按鈕,點選會更新TextView。片段也需要註冊和登出EventBus,為了結構更簡潔,所有的東西將會封裝在一個BaseFragment中。
現在我們來建立更多動作。第一個Fragment將會開啟第二個,函式如下:
1 2 3 4 |
@OnClick(R.id.first_button) public void firstButtonClick() { EventBus.getDefault().post(new ShowFragmentEvent(new SecondFragment())); } |
注意,這裡我使用了ButterKnife表示法。它可以生成更簡潔的程式碼,如果你還沒用過,現在開始用吧。
第二個Fragment中的按鈕將會向EventBus傳送一個事件來改變TextView。
1 |
EventBus.getDefault().post(new UpdateTextEvent(getString(R.string.text_updated))); |
第二個Fragment也需要監聽這個事件,這樣它收到事件時,可以相應改變文字。
1 2 3 |
public void onEvent(UpdateTextEvent event) { textView.setText(event.getTitle()); } |
我們建立了一個包含兩個Fragment的基本應用,它們通過事件通訊,其中一個通過事件來更新。我已經把程式碼提交到GitHub上,你可以檢出看看。
關鍵問題是怎麼提升一個事件驅動架構。下篇文章我將提出一個簡潔易懂的架構,來支援Anroid中的事件驅動程式設計。