第 3 章 Android事件处理 本章要点 . 基于监听的事件处理模型 . 实现事件监听器的4种方式 . 基于回调的事件处理模型 . 事件传播 . 事件直接绑定到标签 . Handler消息传递机制 . AsyncTask异步任务处理 本章知识结构图 Android编程(第2版) 本章示例 前面学习了Android中提供的一些基本控件,将来在第10 章还会介绍其他功能强大 的界面控件,关于Android提供的其他控件,读者可以查找有关参考资料。但是,这些控 件主要用来进行数据显示,如果用户想与之进行交互,实现具体的功能,则还需要相应事 件处理的辅助。当用户在程序界面上执行各种操作,如单击一个按钮时,应用程序必须为 用户动作提供响应动作,这种响应动作就需要通过事件处理来完成。 Android中提供了三种事件处理方式:基于回调的事件处理、基于监听的事件处理 和直接绑定到标签的事件处理。这三种事件处理方式各有优缺点和适合使用的场景。回 调机制主要是重写一些系统中已定义好的方法,这些方法调用的时机是自动的,只是默认 情况下什么都不做;监听机制则需要为控件绑定监听器,事件发生时将会执行相应的方 法,对于开发人员来说更为灵活、自由、可控性较高。直接绑定到标签的机制则直接指定 事件的处理方法,主要针对非常常见的单击事件,更为方便简单。Android系统充分利用 了三种事件处理的优点,允许开发者采用自己熟悉的事件处理方式来为用户操作提供 响应。 在Android中,用户界面属于主线程,而子线程无法更新主线程的界面状态。那么, 如何才能动态地显示用户界面呢? 本章介绍通过Handler消息传递来动态更新界面。 如果在事件处理中需要做一些比较耗时的操作,直接放在主线程中将会阻塞程序的 运行,给用户以不好的体验,甚至会造成程序没有响应或强制退出。本章将学习如何通过 AsyncTask异步方式来处理耗时的操作。 60 第3章Android事件处理 学完本章之后,再结合前面所学知识,读者将可以开发出界面友好、人机交互良好的 Android应用。 3.nrid的事件处理机制 1 Ado 任何手机应用都离不开与用户的交互,只有通过用户的操作,才能知道用户的需求, 从而实现具体的业务功能。因此,应用中经常需要处理的就是用户的操作,即为用户的操 作提供响应,这种为用户操作提供响应的机制就是事件处理。 Android提供了强大的事件处理机制,包括以下三种。 (1)基于监听的事件处理:主要做法是为Android界面控件绑定特定的事件监听 器,在事件监听器的方法里编写事件处理代码,由系统监听用户的操作,一旦监听到用户 事件,将自动调用相关方法来处理。 (2)基于回调的事件处理:主要做法是重写Android控件特定的回调方法,或者重 写Activity的回调方法。Android为绝大部分界面控件提供了事件响应的回调方法,只 需重写它们即可,由系统根据具体情景自动调用。 (3)直接绑定到标签:主要做法是在界面布局文件中为指定标签设置事件属性,属 性值是一个方法的方法名,然后再在Activity中定义该方法,编写具体的事件处理代码。 一般来说,直接绑定到标签只适合于少数指定的事件,非常方便;基于回调的事件处 理代码比较简洁,可用于处理一些具有通用性的系统定义好的事件。但对于某些特定的 事件,无法使用基于回调的事件处理,只能采用基于监听的事件处理。实际应用中,基于 监听的事件处理方法应用最广泛。 1.基于监听的事件处理 3.1 Android的基于监听的事件处理模型与Java的AWT 、Swing的处理方式几乎完全 一样,只是相应的事件监听器和事件处理方法名有所不同。在基于监听的事件处理模型 中,主要涉及以下三类对象。 (1)EventSource(事件源):产生事件的控件即事件发生的源头,如按钮、菜单等。 (2)Event(事件): 具体某一操作的详细描述,事件封装了该操作的相关信息,如果程 序需要获得事件源上所发生事件的相关信息,一般通过Event对象来取得,例如按键事件 按下的是哪个键、触摸事件发生的位置等。 (3)EventListener(事件监听器): 负责监听用户在事件源上的操作,并对用户的各种 操作做出相应的响应。事件监听器中可包含多个事件处理器,一个事件处理器实际上就 是一个事件处理方法。 那么在基于监听的事件处理中,这三类对象又是如何协作的呢? 实际上,基于监听的 事件处理是一种委托式事件处理。普通控件(事件源)将整个事件处理委托给特定的对象 (事件监听器); 当该事件源发生指定的事件时,系统自动生成事件对象,并通知所委托的 事件监听器,由事件监听器相应的事件处理器来处理这个事件。具体的事件处理模型如 图3-1所示。当用户在Android控件上进行操作时,系统会自动生成事件对象,并将这个 61 Android编程(第2版) 事件对象以参数的形式传给注册到事件源上的事件监听器,事件监听器调用相应的事件 处理器来处理。 图3- 1 基于监听的事件处理模型 委托式事件处理非常好理解,就类似于生活中每个人能力都有限,当碰到一些自己处 理不了的事情时,就委托给某个机构或公司来处理。委托人需要将遇到的事情和要求描 述清楚,这样,其他人才能比较好地解决问题,然后该机构会选派具体的员工来处理这件 事。其中,我们是事件源,遇到的事情就是事件,该机构就是事件监听器,具体解决事情的 员工就是事件处理器。 基于监听的事件处理模型的主要编程步骤如下。 (1)获取普通界面控件(事件源), 也就是被监听的对象。 (2)实现事件监听器类,该监听器类是一个特殊的Java类,必须实现一个 XxxListener接口,并实现接口里的所有方法,每个方法用于处理一种事件。 (3)调用事件源的setXxxListener方法将事件监听器对象注册给普通控件(事件 源), 即将事件源与事件监听器关联起来,这样,当事件发生时就可以自动调用相应的 方法。 在上述步骤中,事件源比较容易获取,一般就是界面控件,根据findViewById() 方法 即可得到;调用事件源的setXxxListener方法是由系统定义好的,只需要传入一个具体的 事件监听器;所以,我们所要做的就是实现事件监听器。所谓事件监听器,其实就是实现 了特定接口的Java类的实例。在程序中实现事件监听器,通常有如下几种形式。 (1)内部类形式:将事件监听器类定义为当前类的内部类。 (2)外部类形式:将事件监听器类定义成一个外部类。 (3)类自身作为事件监听器类:让Activity本身实现监听器接口,并实现事件处理 方法 ( 。 4)匿名内部类形式:使用匿名内部类创建事件监听器对象。 下面以一个简单的程序来示范基于监听的事件处理模型的实现过程。该程序实现简 单文本编辑功能,可以控制文本颜色、大小、样式以及文本的内容,程序界面布局中定义了 一些文本显示框和若干个按钮,并为所有的按钮注册了单击事件监听器,为测试文本编辑 62 第3章 Android事件处理 63 框注册了长按事件监听器。为了演示各种实现事件监听器的方式,该程序中使用了4种 实现事件监听器的方式。界面分析与运行效果如图3-2所示。 图3-2 简单文本编辑器 界面整体采用表格布局,第一行仅包含一个TextView用于显示测试文本,第二行包 含大小提示信息以及“增大”“缩小”两个按钮,第三行包含颜色提示信息以及“红色”“绿 色”“蓝色”三个按钮,第四行包含样式提示信息以及“加粗”“倾斜”“默认”三个按钮。界面 布局的详细代码如下。 程序清单:codes\ch03\TextEditorTest\app\src\main\res\layout\activity_main.xml 1 →内边距为10dp 6 →大小为24sp 12 →右边距为10dp 14 →文本提示信息 15