Java事件模型与Android事件模型的比较.doc_第1页
Java事件模型与Android事件模型的比较.doc_第2页
Java事件模型与Android事件模型的比较.doc_第3页
Java事件模型与Android事件模型的比较.doc_第4页
Java事件模型与Android事件模型的比较.doc_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

本文由麦可网/收集整理,转载请注明出处。Java事件模型与Android事件模型的比较比较结果:Android借鉴了Java2中的UI事件处理机制,但是,Android又提供了另一种事件?理器(event handler),而这个方式是否与java1.0事件模型一样呢,有待求证。Java事件模型:我们把JDK1.0事件处理模型成为Java1.0事件模型,而从jdk1.1后的版本事件处理模型称为Java 2事件处理模型。1. Java1.0事件模型:dispatchEvent()-postEvent()-handleEvent()在JDK1.0的版本采用用的事件模型,提供了基本的事件处理功能。这是一种包容模型,所有事件都封装在单一的类Event中,所有事件对象都由单一的方法 handleEvent来处理,这些定义都在Component类中。为此,只有Component类的子类才能充当事件处理程序,事件处理传递到组件层次结构,如果目标组件不能完全处理事件,事件被传递到目标组件的容器。在Java1.0事件处理模型中事件处理是以如下方法执行的。deliverEvent()用于决定事件的目标,目标是处理事件的组件或容器,此过程开始于GUI层的最外部而向内运作。当按一个button时,如果检测到是该按钮激发的事件,该按钮会访问它的deliverEvent()方法,这一操作由系统完成。一旦识别目标组件,正确事件类型发往组件的postEvent()方法,该方法依次把事件送到handleEvent()方法并且等待方法的返回值。true表明事件完全处理,false将使postEvent()方法联系目标容器,希望完成事件处理。2. Java 2事件处理模型:在Java2处理事件时,没有采用dispatchEvent()-postEvent()-handleEvent()方式,采用了监听器类,每个事件类都有相关联的监听器接口。事件从事件源到监听者的传递是通过对目标监听者对象的Java方法调用进行的。对每个明确的事件的发生,都相应地定义一个明确的Java方法。这些方法都集中定义在事件监听者(EventListener)接口中,这个接口要继承 java.util.EventListener。 实现了事件监听者接口中一些或全部方法的类就是事件监听者。伴随着事件的发生,相应的状态通常都封装在事件状态对象中,该对象必须继承自java.util.EventObject。事件状态对象作为单参传递给应响应该事件的监听者方法中。发出某种特定事件的事件源的标识是:遵从规定的设计格式为事件监听者定义注册方法,并接受对指定事件监听者接口实例的引用。3. Java事件和万事一样有其生命周期,会出生也会消亡。下图3.1给出了Java事件生命周期的示意图:事件最初由事件源产生,事件源可以是GUI组件Java Bean或由生成事件能力的对象,在GUI组件情况下,事件源或者是组件的同位体(对于Abstract Window ToolkitawtGUI组件来说)或组件本身(对于Swing组件来说)。事件生成后放在系统事件队列内部。现在事件处于事件分发线程的控制下。事件在队列中等待处理,然后事件从事件队列中选出,送到 dispatchEvent()方法,dispatchEvent()方法调用processEvent()方法并将事件的一个引用传递给 processEvent()方法。此刻,系统会查看是否有送出事件的位置,如果没有这种事件类型相应的已经注册的监听器,或者如果没有任何组件受到激活来接收事件类型,事件就被抛弃。当然上图显示的是AWTEvent类的子类的生命周期。 dispatchEvent()方法和processEvent()方法把AWTEvent作为一个参数。但对,javax.swing.event并不是AWTEvent子类,而是从EventObject直接继承过来,生成这些事件的对象也会定义fireEvent()方法,此方法将事件送到包含在对象监听器列表内的那种类型的任何监听器。3.2 Java事件捕获从上面的分析我们知道,任何事件产生到 dispatchEvent()方法分发方法前,所有的事件都是存放在系统事件的队列中,而且所有的事件都由dispatchEvent()方法来分派。所以只要能重载dispatchEvent()方法就可以获取系统的所有事件,包括用户输入事件。一般来说,系统事件队列的操作对用户来说是可以控制。它在后台自动完成所要完成的事情,使用EventQueue类可以查看甚至操纵系统事件队列。Java提供了EventQueue类来访问甚至操纵系统事件队列。EventQueue类中封装了对系统事件队列的各种操作,除dispatchEvent()方法外,其中最关键的是提供了push()方法,允许用特定的EventQueue来代替当前的EventQueue。只要从EventQueue类中派生一个新类,然后通过push()方法用派生类来代替当前的EventQueue类即可。这样,所有的系统事件都会转发到派生EventQueue类。而在实际的开发中,我们并不关心事件的分派方式,也就是说,并不会重载dispatchEvent(),因为我们的目的并不是取系统的所有事件,而是对感兴趣的事件(例如,按键,鼠标的按下与释放)进行处理,而这些事件不会凭空产生,是由事件源(例如,button,window这些GUI组件产生的)。另一个原因是,java2中已经给我们提供了事件监听这种处理方式,而且是非常安全的,并且也易于开发,4. 如何使用事件处理模型对事件进行处理:作为一个程序开发者,我们所要做的是创建事件监听器对象并且在被激活事件的组件中进行注册。在java中,每一个组件会产生什么样的事件,已经被定义好了。或者说,对于任何一个事件来说,哪些组件可以产生它,已经是确定的了。(1) 为了创建事件监听器以及在被激活事件的组件中进行注册,需要了解以下四个组件概念。事件类、事件监听器、事件处理器和适配器四个组件。事件类:见图4.1事件监听器:是interface, 形中XXListener,而且,在java中,这些interface已经被定义好了。用来被实现,它定义了事件处理器(即事件处理的方法原型,这个方法需要被重新实现)。例如,ActionListener接口,MouseListener接口WindowListener接口KeyListener接口ItemListener接口MouseMotionListener接口FocusListener接口ComponentListener接口适配器:因为对于有的事件监听器来说(例如,MouseListener),java已经提供了实现它的类,那么我们就可以直接继承这个类,来处理事件。Java提供了表示不同的事件的类, java.util. EventObject是事件顶层类,其层次结构如下:图4.1需要说明的是:? EventObjet类提供了getSource()方法获取产生事件的源对象。? AWTEvent类提供了getID() 方法返回事件本性的标识符。例如,如果鼠标事件发生,能够查出是单击、拖拉、按、还是其他操作。(2)程序开发步骤:所谓的创建事件监听器对象,就是创建一个类,而这个类必须实现形如XXListener的接口(或者继承”已经实现了XXListener的类”),当然,实现这个接口就意味着重写XXListener的方法。例如,对于ActionListener, 只有一个actionPerformed方法:class B1 implements ActionListener / 实现ActionListenerpublic void actionPerformed(ActionEvent e) /重写actionPerformed getAppletContext().showStatus(Button 1);在被激活事件的组件中注册事件监听器: 即调用形如addXXListener()的方法,例如:Button b1 = new Button(Button 1),b1.addActionListener(new B1();/注册事件监听器,b1就是被激活事件的组件这样一来,当事件被激活时,处理流程如下(根据图3.1对照来看):由于已经通过 addActionListener进行了事件监听器的注册,所以,就会调用到特定的事件处理方法,即actionPerformed()函数。这样,执行的结果就要看actionPerformed是具体做什么工作了。 完整的例子(来源于think in java 13.16.1节): /: Button2New.java/ Capturing button pressesimport java.awt.*;import java.awt.event.*; / Must add thisimport java.Applet.*; public class Button2New extends Applet Button b1 = new Button(Button 1), b2 = new Button(Button 2); public void init() b1.addActionListener(new B1(); b2.addActionListener(new B2(); add(b1); add(b2); class B1 implements ActionListener public void actionPerformed(ActionEvent e) getAppletContext().showStatus(Button 1); class B2 implements ActionListener public void actionPerformed(ActionEvent e) getAppletContext().showStatus(Button 2); 这是最常用的一种方式:定义一个内部类,来实现ActionListener监听器。而在外部类中,定义一个这样的对象,去注册监听器,通过调用 addActionListener方法,需要注意的是,这个内部类对象是作为addActionListener的参数,在本类中,是直接作为匿名对象被创建的。这里,也可以不用匿名对象,而直接new 一个对象,然后,这个对象作为参数传给addActionListener。考虑:不用匿名对象与用匿名对象的区别? 更多的例子,请参考think in java 13.16,推荐编码方法见think in java 13.16.7推荐编码方法 Android事件模型(从UI角度来说):从网上摘抄了一些相关文章(共5篇),从这几篇文章来看,Android事件模型与java2的事件模型处理方式一样,对事件的处理,都是采用事件监听器的方式来实现的。文章1:Jollen 的 Android 教?,#15: 什?是事件毕?器(Event Listener)?生基本的UI後,接著就要?UI的事件?理(UI Events),才能?UI陪使用者互?。什?是事件毕?器(Event Listener)UI的使用者事件?理,即View如何?理使用者的操作,是一?重要的疹铨。View是重要的?,它是陪使用者互?的前?;在Android框架的韵?中,以事件毕?器(event listener)的方式?理UI的使用者事件。Android框架提供了非常良好的UI事件?理?制。先前的教?提到,View是捞氧UI的?,每?View物件都可以向Android框架暂?一?事件毕?器。每?事件毕?器都包含一?回呼函?(callback method),呃?回呼函?(callback method)主要的工作就是回?或?理使用者的操作。Event Listener: 以Click Listener?例以使用者狱碰(touch)的?作?真,?View要?理使用者狱碰的事件?,就要向Android框架暂?View.OnClickListener事件毕?器;?touch事件办生?,Android框架便回呼事件毕?器彦的回呼函?。View.OnClickListener是click listener,故名思意,呃是UI的Click?作毕?器;?使用者?View咄行Click操作?(即狱控?面上的UI元件),Android 框架便?回呼呃?View.OnClickListener的回呼函?。View.OnClickListerner的回呼函?OnClick()。呃彦所提到的毕?器泛指event listener,主要用?毕?使用者的各肺?作。除了View.OnClickListener外,Android框架?有以下的event listener(及其callback method):View.OnLongClickListener: onLongClick()View.OnFocusChangeListener: onFocusChange()View.OnKeyListener: onKey()View.OnTouchListener: onTouch()View.OnCreateContextMenuListener: onCreateContextMenu()另外一肺?理UI事件的?制?事件?理器(event handler),event handler陪event listener是不一?的二肺?理?制。在自?Android component的教?彦,再介铰呃?部份。文章2:如果玩过数独游戏,就会知道该游戏有时候非常容易,而有时候简直令人抓狂。因此,当用户选择New Game按钮时,就应该弹出一个对话框,要求用户从3个难度级别中选择一个。在Android中,从事件列表中选择某个事件非常容易实现。首先,需要在 res/values/strings.xml文件中再添加几个字符串:其次,使用数组资源在res/values/arrays.xml文件中创建难度列表:然后,在Sudoku类中再导入几个包:最后,在onClick()方法的switch语句中添加处理New Game按钮单击事件的代码:其中,openNewGameDialog()方法的作用是创建一个处理难度列表的用户界面。setItems()方法有两个参数:条目列表的资源ID和一个监听器,用户选择某个条目时,该监听器将被调用。现在,运行该程序并按下New Game,将会出现如图3-12中所示的对话框。图3-12选择难度级别对话框实际上,此时我们并不打算开始一次新游戏。因此,当用户选择某个难度级别时,该程序只是利用Log.d()方法输出一条调试消息。Log.d()方法接收两个参数:一个标记字符串和要输出的一条消息。文章3:Widget中事件监听器的实现Widget中事件监听器的实现widget中是没有click listener的,那么如何实现点击的动作呢?我们可以通过广播的形式来替代click linstener。我们知道widget其实就是一个BroadcastReceiver,所以在AndroidManifest.xml中,注册一个新的action:代码中需要触发点击事件的地方发送一个广播:Intent intent = new Intent(com.android.CLICK);PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, 0);views.setOnClickPendingIntent(R.id.textview, pi);在widget的onReceive() 方法中接收这个广播:public void onReceive(Context context, Intent intent) super.onReceive(context, intent);String action = intent.getAction();if (action.equals(com.android.CLICK) /TODO 处理点击事件这样就完成了widget中的一次点击事件TOP文章4:Reference/android/view/ViewFrom Android中文网Android中文网(androidcn.NET) 版权申明 : creativecommons licensesJump to: navigation, searchandroid.view公有类android.

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论