前篇文章我们简短地介绍了事件驱动编程。现在我们看下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中的事件驱动编程。