手把手教你学Android应用开发教程——第四章

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

最新文档


当前位置:首页 > 图纸专区 > 小学资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!