Android事件驱动编程-基于EventBus(二)

Android事件驱动编程(二)

——欢迎转载,请注明出处 http://blog.csdn.net/asce1885 ,未经本人同意请勿用于商业用途,谢谢——

原文链接:https://medium.com/google-developer-experts/event-driven-programming-for-android-part-ii-b1e05698e440

本文Gitbooks链接:http://asce1885.gitbooks.io/android-rd-senior-advanced/content/androidshi_jian_qu_dong_bian_cheng_ff08_er_ff09.html

在前面的文章中我们简单介绍了事件驱动编程,现在让我们看看真实的代码并介绍EventBus的基础用法。

首先我会参考下图(从EventBus仓库截取的),介绍在事件驱动编程中扮演中心角色的实体们。

  • 事件总线EventBus:连接所有其他实体的中央通信通道;
  • 事件Event:发生的动作,几乎可以是任何事情(应用启动,收到某些数据,用户交互等等);
  • 订阅者Subscriber:订阅者监听事件总线,当总线中有事件在流通时,订阅者将被触发;
  • 发布者Publisher:往事件总线发送事件;

唯有亲身实践才能有清晰的认知,下面就让我们来看一个简单的例子:

  • 一个加载了两个fragments的应用;
  • 第二个fragment包含一个TextView,当单击按钮时,TextView将被刷新;
  • 当新的fragment显示在当前屏幕上时,ActionBar标题栏将随之改变;

宿主Activity

宿主Activity需要在它的onCreate函数中注册EventBus:

EventBus.getDefault().register(this);

注册之后,宿主Activity就可以从总线上读取数据了,我们同时需要在Activity的onDestroy函数中反注册EventBus:

EventBus.getDefault().unregister(this);

Activity会捕获到两个不同的事件:一个用于更新ActionBar,一个用于加载第一个fragment。我们会编写两个onEvent函数来处理这两个事件:

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());
}

事件

每个事件需要在类中声明,事件中可以包含变量:

public final class ShowFragmentEvent {
 private Fragment fragment;
  public ShowFragmentEvent(Fragment fragment) {
    this.fragment = fragment;
  }
  public Fragment getFragment() {
    return fragment;
  }
}

The Fragments

接下来我们要来创建fragments。第一个fragment包含一个用来打开第二个fragment的按钮,第二个fragment包含一个按钮,当点击按钮时,将刷新TextView。Fragments也需要注册和反注册EventBus,为了得到一个简洁的结构,我们将定义一个BaseFragment来封装这些公共的操作。

现在让我们创建更多一些动作,第一个fragment将通过下面的函数来打开第二个fragment:

@OnClick(R.id.first_button)
 public void firstButtonClick() {
    EventBus.getDefault().post(new ShowFragmentEvent(new SecondFragment()));
 }

需要注意的是这里我使用了ButterKnife中定义的注解,它可以产生更简单和整洁的代码。如果你还没有使用过它,那么现在应该开始使用了。

第二个fragment的按钮会向事件总线发送一个事件,用来更新TextView:

EventBus.getDefault().post(new UpdateTextEvent(getString(R.string.text_updated)));

第二个fragment同时需要监听这个事件,这样当它接收到这个事件时,可以相应的改变文字显示:

public void onEvent(UpdateTextEvent event) {
    textView.setText(event.getTitle());
}

我们的简单应用具有两个fragments,通过事件实现两个fragments之间的通信,一个fragment通过事件获得更新。我已经把代码上传到GitHub上面,你可以检出并看一下。

一个关键的问题是如何逐步升级一个事件驱动的架构。在下一篇文章中我将介绍一个简洁的,可理解的架构,来支持Android中的事件驱动编程。

时间: 2024-10-13 05:33:35

Android事件驱动编程-基于EventBus(二)的相关文章

Android事件驱动编程-基于EventBus(一)

Android事件驱动编程-基于EventBus(一) --欢迎转载,请注明出处 http://blog.csdn.net/asce1885 ,未经本人同意请勿用于商业用途,谢谢-- 原文链接:https://medium.com/google-developer-experts/event-driven-programming-for-android-part-i-f5ea4a3c4eab 本文Gitbooks链接:http://asce1885.gitbooks.io/android-rd-

Android 界面编程 探险(二)

本篇将开始Android 界面编程探险(二)的旅程. 1.UI组件-AdapterView及其子类(二) 1)自动完成文本框(AutoCompleteTextView)的用法 MultiAutoCompleteTextView是AutoCompleteTextView派生的子类,MultiAutoCompleteTextView允许输入多个提示项,多个提示项以分隔符分隔.下面简单演示AutoCompleteTextView和MultiAutoCompleteTextView的用法: main.x

Android高级编程笔记(四)深入探讨Activity(转)

在应用程序中至少包含一个用来处理应用程序的主UI功能的主界面屏幕.这个主界面一般由多个Fragment组成,并由一组次要Activity支持.要在屏幕之间切换,就必须要启动一个新的Activity.一般的Activity都占据了整个显示屏,但可以创建成半透明或二者浮动的Activity. 一.创建Activity 通过继承Activity类可以创建一个Activity窗口,基本框架如下: 1 public class MyActivity extends Activity { 2 @Overri

Android网络编程之传递数据给服务器(二)

Android网络编程之传递数据给服务器(二) 请尊重他人的劳动成果,转载请注明出处:Android网络编程之传递数据给服务器(二) 我曾在<Android网络编程之传递数据给服务器(一)> 一文中介绍了如何通过GET方式传递数据给服务器,通过GET方式传递数据主要适用于数据大小不超过2KB,且对安全性要求不高的情况下.下面就介绍通过POST方式传递数据主到服务器. 一.通过Post方式传递数据给服务器 通过Post方式传递数据给服务器是Android应用程序开发提交数据给服务器的一种主要的方

Android网络编程之使用HttpClient批量上传文件(二)AsyncTask+HttpClient并实现上传进度监听

请尊重他人的劳动成果,转载请注明出处: Android网络编程之使用HttpClient批量上传文件(二)AsyncTask+HttpClient并实现上传进度监听 运行效果图: 我曾在<Android网络编程之使用HttpClient批量上传文件>一文中介绍过如何通过HttpClient实现多文件上传和服务器的接收.在上一篇主要使用Handler+HttpClient的方式实现文件上传.这一篇将介绍使用AsyncTask+HttpClient实现文件上传并监听上传进度. 监控进度实现: 首先

Android界面编程——Android布局组件(二)

Android界面编程 2.3.1 布局介绍 布局用于定义Activity中UI元素的排列结构,Android提供了LinearLayout线性布局.RelativeLayout相对布局 .FrameLayout帧布局 .TableLayout表格布局.AbsoluteLayout坐标布局 共五种布局,可以通过两种方式声明布局: ? 在 XML 中声明 UI 元素.Android 提供了对应于 View 类及其子类的XML 元素 ? 运行时实例化布局元素.可以通过编程创建 View 对象和 Vi

Android网络编程(二)HttpClient与HttpURLConnection

相关文章 Android网络编程(一)HTTP协议原理 前言 上一篇我们了解了HTTP协议原理,这一篇我们来讲讲Apache的HttpClient和Java的HttpURLConnection,这两种都是我们平常请求网络会用到的.无论我们是自己封装的网络请求类还是第三方的网络请求框架都离不开这两个类库. 1.HttpClient Android SDK中包含了HttpClient,在Android6.0版本直接删除了HttpClient类库,如果仍想使用则解决方法是: 如果使用的是eclipse

dojo事件驱动编程之事件绑定

什么是事件驱动? 事件驱动编程是以事件为第一驱动的编程模型,模块被动等待通知(notification),行为取决于外来的突发事件,是事件驱动的,符合事件驱动式编程(Event-Driven Programming,简称EDP)的模式. 何谓事件?通俗地说,它是已经发生的某种令人关注的事情.在软件中,它一般表现为一个程序的某些信息状态上的变化.基于事件驱动的系统一般提供两类的内建事件(built-in event):一类是底层事件(low-level event)或称原生事件(native ev

Android 网络编程 记录

简单介绍 看了深入理解Android网络编程感觉不错.今天对Android网络编程进行了要点记录. 内容 Android基于网络技术和编程实践 要点 定义 描写叙述 IP协议 用于报文交换网络的一种面向数据的协议   TCP协议 传输控制协议,传输层通信协议.   UDP协议 用户数据报协议.传输层协议.   SMTP协议 简单邮件传输协议   SOCKET 套接字 应用层与TCP/IP协议族通信的中间软件抽象层. 类型有两种:TCP套接字和UDP套接字. TCP套接字   在保证可靠性上,採用