首页 理论教育 监听处理模型中的三种对象

监听处理模型中的三种对象

时间:2023-10-22 理论教育 版权反馈
【摘要】:在Android系统基于监听的事件处理模型中,主要涉及了如下三类对象。通过图8-1可知,基于监听器的事件处理模型的处理流程如下。在事件监听的处理模型中涉及了三个成员,分别是事件源、事件和事件监听器,其中事件源最容易创建,任意界面组件都可作为事件源。所以说,实现事件监听器是整个事件处理的核心工作。Android对上述事件监听模型进行了简化操作,如果事件源触发的事件足够简单,并且事件里触发的信息有限。

监听处理模型中的三种对象

在Android系统基于监听的事件处理模型中,主要涉及了如下三类对象。

■ 事件源Event Source:产生事件的来源,通常是各种组件,如按钮、窗口等。

■ 事件Event:事件封装了界面组件上发生的特定事件的具体信息,如果监听器需要获

取界面组件上所发生事件的相关信息,一般通过事件Event对象来传递。

■ 事件监听器Event Listener:负责监听事件源发生的事件,并对不同的事件做相应的

处理。

基于监听的事件处理的处理流程如图8-1所示。

通过图8-1可知,基于监听器的事件处理模型的处理流程如下。

(1)用户按下屏幕中的一个按钮或者单击某个菜单项。

(2)按下动作会激活一个相应的事件,这个事件会触发事件源上注册的事件监听器。

(3)事件监听器会调用对应的事件处理器(事件监听器里的实例方法)来做出相应的响应

由此可见,基于监听器的事件处理机制是一种委派式(Delegation)的事件处理方式,事件源将整个事件委托给事件监听器,由监听器对事件进行响应处理。这种处理方式将事件源和事件监听器分离,有利于提供程序的可维护性。每个组件都可以针对特定的事件指定一个事件监听器,每个事件监听器也可监听一个或多个事件源。因为在同一个事件源上有可能会发生多种未知的事件,所以委派式(Delegation)的事件处理方式会把事件源上所有可能发生的事件分别授权给不同的事件监听器来处理。同时也可以让某一类事件都使用同一个事件监听器进行处理。

978-7-111-54543-9-Part02-389.jpg

图8-1 基于监听的事件处理的处理流程

例如在下面的实例中,演示了基于监听的事件处理的基本过程

978-7-111-54543-9-Part02-390.jpg

在本实例的UI界面布局页面中分别定义了一个文本框控件和一个按钮控件,布局文件main.xml的具体实现代码如下。

978-7-111-54543-9-Part02-391.jpg(www.xing528.com)

通过上述代码将按钮设置为事例源,然后编写Java程序文件EventEX.java,功能是为上述按钮绑定一个事件监听器,具体实现代码如下。

978-7-111-54543-9-Part02-392.jpg

在上述代码中定义了View.OnClickListener实现类,这个实现类将会被作为事件监听器来使用。通过如下所示的代码为按钮“bn”注册事件监听器。当按钮“b”被单击时会触发这个处理器,将程序中的文本框内容变为“bn按钮被单击了!”。

978-7-111-54543-9-Part02-393.jpg

本实例执行后的效果如图8-2所示,单击“单击我”按钮后的效果如图8-3所示

978-7-111-54543-9-Part02-394.jpg

图8-2 初始执行效果

978-7-111-54543-9-Part02-395.jpg

图8-3 单击按钮后的执行效果

由此可见,当事件源上发生指定的事件时,Android会触发事件监听器,由事件监听器调用相应的方法(事件处理器)来处理事件。并且可以看出,基于监听的事件处理规则如下

■ 事件源:应用程序的任何组件都可以作为事件源。

■ 事件监听:监听器类必须由程序员负责实现,实现事件监听的关键就是实现处理器

方法。

■ 注册监听:只要调用事件源的setXxxListener(XxxLinstener)方法即可。

当外部动作在Android组件上执行操作时,系统会自动生成事件对象,这个事件对象会作为参数传递给事件源,并在上面注册事件监听器。在事件监听的处理模型中涉及了三个成员,分别是事件源、事件和事件监听器,其中事件源最容易创建,任意界面组件都可作为事件源。事件的产生无须开发者关心,它是由系统自动产生的。所以说,实现事件监听器是整个事件处理的核心工作。

Android对上述事件监听模型进行了简化操作,如果事件源触发的事件足够简单,并且事件里触发的信息有限。那么就无须封装事件对象,将事件对象传入事件监听器即可。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈