手把手教你学Android应用开发教程第四章_第1页
手把手教你学Android应用开发教程第四章_第2页
手把手教你学Android应用开发教程第四章_第3页
手把手教你学Android应用开发教程第四章_第4页
手把手教你学Android应用开发教程第四章_第5页
已阅读5页,还剩26页未读 继续免费阅读

VIP免费下载

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

文档简介

.,第四章事件处理机制,倚动软件工厂实验室,.,2,本章要点,基于监听的事件处理模型,实现事件监听器的四种方式,基于回调的事件处理模型,事件传播,事件直接绑定到标签,Hanlder消息传递机制,使用Handler动态生成随机数,AsyncTask异步任务处理,.,3,结构导图,.,4,Android的事件处理机制,主要做法就是为Android界面组件绑定特定的事件监听器,在事件监听器的方法里编写事件处理代码。,主要做法就是重写Android组件特定的回调方法,或者重写Activity的回调方法。Android为绝大部分界面组件都提供了事件响应的回调方法,我们只需重写它们即可,由系统根据具体情景自动调用。,主要做法就是在界面布局文件中为指定标签设置事件属性,属性值是一个方法的方法名,然后再在Activity中定义该方法,编写具体的事件处理代码。,.,5,1,基于监听的事件处理,2,Android的基于监听的事件处理模型与Java的AWT、Swing的处理方式几乎完全一样,只是相应的事件监听器和事件处理方法名有所不同。在基于监听的事件处理模型中,主要涉及到三类对象:EventSource(事件源):事件发生的场所,通常就是各个组件,例如按钮、菜单等;Event(事件):事件封装了界面组件上发生的特定事情(通常就是一次用户操作),如果程序需要获得界面组件上所发生事件的相关信息,一般通过Event对象来取得;EventListener(事件监听器):负责监听事件源所发生的事件,并对各种事件做出相应的响应。,3,.,6,基于监听的事件处理,基于监听的事件处理是一种委托式事件处理:普通组件(事件源)将整个事件处理委托给特定的对象(事件监听器);当该事件源发生指定的事情时,系统自动生成事件对象,并通知所委托的事件监听器,由事件监听器相应的事件处理器来处理这个事件。,这三类对象如何协同工作?,.,7,基于监听的事件处理,基于监听的事件处理模型,.,8,基于监听的事件处理,对委托式事件处理的理解:,委托式事件处理就如同生活中我们每个人的能力都有限,当碰到一些自己处理不了的事情时,就委托给某个机构或公司来处理。你需要把你所遇到的事情和要求描述清楚,这样,其他人才能比较好地解决问题,然后该机构会选派具体的员工来处理这件事。其中,我们自己就是事件源,你遇到的事情就是事件,该机构就是事件监听器,具体解决事情的员工就是事件处理器。,.,9,基于监听的事件处理,基于监听的事件处理模型的编程步骤:,Step1:获取普通界面组件(事件源),即被监听的对象;Step2:实现事件监听器类,该监听器类是一个特殊的Java类,必须实现一个XxxListerner接口;Step3:调用事件源的setXxxListener方法将事件监听器对象注册给普通组件(事件源)。,.,10,基于监听的事件处理,实现事件监听器的四种形式:,内部类形式:将事件监听器类定义为当前类的内部类;外部类形式:将事件监听器类定义成一个外部类;类自身作为事件监听器类:让Activity本身实现监听器接口,并实现事件处理方法;匿名内部类形式:使用匿名内部类创建事件监听器对象。,.,11,基于监听的事件处理,实现事件监听器的四种形式程序实例,.,12,基于监听的事件处理,常见事件监听器接口及其处理方法:,.,13,基于监听的事件处理,View类的常见事件注册方法:,.,14,基于回调的事件处理,View类包含的主要回调方法:,booleanonKeyDown(intkeyCode,KeyEventevent):该方法是接口KeyEvent.Callback中的抽象方法,该方法用于捕捉手机键盘被按下的事件。keyCode为被按下的键值即键盘码,event为按键事件的对象,其中包含了触发事件的详细信息,例如事件的状态、类型、发生的时间等。当用户按下按键时,系统会自动将事件封装成KeyEvent对象供应用程序使用;booleanonKeyUp(intkeyCode,KeyEventevent):该方法用于捕捉手机键盘按键抬起的事件;booleanonTouchEvent(MotionEventevent):该方法在View类中定义,该方法用于处理手机屏幕的触摸事件,包括屏幕被按下、屏幕被抬起、在屏幕中拖动。,.,15,事件处理的传播,如果说事件监听机制是一种委托式的事件处理,那么回调机制则与之相反,对于基于回调的事件处理模型来说,事件源和事件监听器是统一的,或者说事件监听器完全消失了,当用户在GUI组件上激发某个事件时,组件自己特定的方法将会负责处理该事件。为了使用回调机制类来处理GUI组件上所发生的事件,需要为该组件提供对应的事件处理方法,而Java又是一种静态语言,我们无法为每个对象动态地添加方法,因此只能通过继承GUI组件类,并重写该类的事件处理方法来实现。,.,16,事件处理的传播,几乎所有基于回调的事件处理方法都有一个boolean类型的返回值,该返回值用于标识该处理方法是否能完全处理该事件。如果处理事件的回调方法返回true,表明该处理方法已完全处理该事件,该事件不会传播出去;如果处理事件的回调方法返回false,表明该处理方法并未完全处理该事件,该事件会传播出去。对于基于回调事件传播而言,某组件上所发生的事情不仅激发该组件上的回调方法,也会触发该组件所在Activity的回调方法(前提是事件能传播到Activity)。,.,17,事件处理的传播,最先触发的是该组件所绑定的事件监听器,接着才触发该组件提供的事件回调方法,最后才传播到该组件所在的Activity。如果我们让任何一个事件处理方法返回了true,那么该事件将不会继续向外传播。,当为同一组件,既采用监听模式,同时又采用回调模式,并且重写了该组件所在Activity对应的回调方法,而且程序没有阻止事件传播,即每个方法都返回为false。那么Android系统的调用顺序是什么呢?,.,18,事件处理的传播,案例:自定义一个按钮,重写其按下的回调方法、为其注册按下事件监听器并重写它所在Activity上的按下回调方法,观察事件处理顺序。,如何在布局文件中配置自定义的组件?,做一做:改变方法的返回值(将true改为false),观察控制台输出结果。,.,19,直接绑定到标签,Android提供了一种直接在界面布局文件中为指定标签绑定事件处理方法机制。对于很多Android界面组件标签而言,它们都支持如onClick、onLongClick等属性,这种属性的属性值就是一个形如xxx(Viewsource)方法的方法名。例如在布局文件中为组件添加单击事件的处理方法如下所示:,.,20,Handler消息传递机制,Android平台不允许Activity新启动的线程访问该Activity里的界面组件,这样就会导致新启动的线程无法动态改变界面组件的属性值。但在实际Android应用开发中,尤其是涉及动画的游戏开发中,需要让新启动的线程周期性地改变界面组件的属性值,这就需要借助于Handler的消息传递机制实现。,.,21,Handler消息传递机制,Handler类的常用方法:,.,22,Handler消息传递机制,从Handler类的方法可知,Handler类主要有两个作用:在新启动的线程中发送消息;在主线程中获取、处理消息。那么新启动的线程何时发送消息?主线程又如何去获取并处理消息呢?为了让主线程能“适时”地处理新启动的线程所发送的消息,显然只能通过回调的方式来实现我们只要重写Handler类中处理消息的方法,当新启动的线程发送消息时,Handler类中处理消息的方法被自动回调。,.,23,开发带有Handler类的程序步骤:,Step1:创建Handler类对象,并重写handleMessage()方法;Step2:在新启动的线程中,调用Handler对象的发送消息方法;Step3:利用Handler对象的handleMessage()方法接收消息,然后根据消息的不同执行不同的操作。,Handler消息传递机制,.,24,案例:实现一个动态显示随机数的功能。,Handler消息传递机制,1、尝试通过子线程改变主线程界面;,2、尝试直接在主线程中实现该功能;,3、使用Handler处理机制实现该功能。,.,25,异步任务处理,Android的类AsyncTask对线程间通讯进行了包装,提供了简易的编程方式来使后台线程和UI线程进行通讯:后台线程执行异步任务,并把操作结果通知UI线程。不再需要子线程和Handler就可以完成异步操作并且刷新用户界面。,AsyncTask是抽象类,AsyncTask定义了三种泛型类型Params、Progress和Result。Params:启动任务执行的输入参数,比如HTTP请求的URL;Progress:后台任务执行的百分比;Result:后台执行任务最终返回的结果,比如String,Integer等。,.,26,异步任务处理,onPreExecute():该方法将在执行实际的后台操作前被UI线程调用。可以在该方法中做一些准备工作,如在界面上显示一个进度条,或者一些控件的实例化,这个方法可以不用实现。doInBackground(Params.):将在onPreExecute方法执行后马上执行,该方法运行在后台线程中。这里将主要负责执行那些比较耗时的后台处理工作。可以调用publishProgress方法来实时更新任务进度。该方法是抽象方法,子类必须实现。onProgressUpdate(Progress.):在publishProgress方法被调用后,UI线程将调用这个方法从而在界面上展示任务的进展情况,例如通过一个进度条进行展示。onPostExecute(Result):在doInBackground执行完成后,onPostExecute方法将被UI线程调用,后台的计算结果将通过该方法传递到UI线程,并且在界面上展示给用户。onCancelled():在用户取消线程操作的时候调用。在主线程中调用onCancelled()的时候调用。,AsyncTask类中主要方法:,.,27,异步任务处理,Task的实例必须在UI线程中创建;execute(Params.)方法必须在UI线程中调用;不要手动的调用onPreExecute(),onPostExecute(Result),doInBackground(Params.),onProgressUpdate(Progress.)这几个方法,需要在UI线程中实例化这个task来调用;该task只能被执

温馨提示

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

评论

0/150

提交评论