




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第四章第四章 事件处理机制事件处理机制 倚动软件工厂实验室倚动软件工厂实验室 2 本章要点本章要点 n 基于监听的事件处理模型基于监听的事件处理模型 n 实现事件监听器的四种方式实现事件监听器的四种方式 n 基于回调的事件处理模型基于回调的事件处理模型 n 事件传播事件传播 n 事件直接绑定到标签事件直接绑定到标签 n Hanlder消息传递机制消息传递机制 n 使用使用Handler动态生成随机数动态生成随机数 n AsyncTask异步任务处理异步任务处理 3 结构导图结构导图 4 Android的事件处理机制的事件处理机制 Android的事 件处理机制 基于监听的事件处理 基于回调的事
2、件处理 直接绑定到标签 主要做法就是为Android界面组件绑定特定的事件监 听器,在事件监听器的方法里编写事件处理代码。 主要做法就是重写Android组件特定的回调方法,或 者重写Activity的回调方法。Android为绝大部分界面 组件都提供了事件响应的回调方法,我们只需重写它 们即可,由系统根据具体情景自动调用。 主要做法就是在界面布局文件中为指定标签设置事件 属性,属性值是一个方法的方法名,然后再在Activity 中定义该方法,编写具体的事件处理代码。 5 1 基于监听的事件处理基于监听的事件处理 2 Android的基于监听的事件处理模型与Java的AWT、Swing 的处理
3、方式几乎完全一样,只是相应的事件监听器和事件处理 方法名有所不同。在基于监听的事件处理模型中,主要涉及到 三类对象: EventSource(事件源):(事件源):事件发生的场所,通常就是各 个组件,例如按钮、菜单等; Event(事件):(事件):事件封装了界面组件上发生的特定事情 (通常就是一次用户操作),如果程序需要获得界面组件上 所发生事件的相关信息,一般通过Event对象来取得; EventListener(事件监听器事件监听器):负责监听事件源所发生的事 件,并对各种事件做出相应的响应。 3 6 基于监听的事件处理基于监听的事件处理 基于监听的事件处理是一种委托式事件处理:普通 组
4、件(事件源事件源)将整个事件处理委托给特定的对象 (事件监听器事件监听器);当该事件源发生指定的事情时,系 统自动生成事件对象,并通知所委托的事件监听器, 由事件监听器相应的事件处理器来处理这个事件。 事件 监听器 事件 事件源 这三类对象如何协同工作?这三类对象如何协同工作? 7 基于监听的事件处理基于监听的事件处理 对委托式事件处理的理解:对委托式事件处理的理解: 委托式事件处理就如同生活中我们每个人的能力都有 限,当碰到一些自己处理不了的事情时,就委托给某个机 构或公司来处理。你需要把你所遇到的事情和要求描述清 楚,这样,其他人才能比较好地解决问题,然后该机构会 选派具体的员工来处理这件
5、事。其中,我们自己就是事件 源,你遇到的事情就是事件,该机构就是事件监听器,具 体解决事情的员工就是事件处理器。 8 基于监听的事件处理基于监听的事件处理 基基 于于 监监 听听 的的 事事 件件 处处 理理 模模 型型 9 基于监听的事件处理基于监听的事件处理 基于监听的事件处理模型的编程步骤:基于监听的事件处理模型的编程步骤: Step1Step1:获取获取普通界面组件组件(事件源),即被监听的对象; Step2Step2:实现实现事件监听器类监听器类,该监听器类是一个特殊的 Java类,必须实现一个XxxListerner接口; Step3Step3:调用调用事件源的setXxxList
6、ener方法方法将事件监听器对 象注册给普通组件(事件源)。 10 基于监听的事件处理基于监听的事件处理 实现事件监听器的四种形式:实现事件监听器的四种形式: 内部类形式内部类形式:将事件监听器类定义为当前类的内部类; 外部类形式外部类形式:将事件监听器类定义成一个外部类; 类自身作为事件监听器类:类自身作为事件监听器类:让Activity本身实现监听器接口, 并实现事件处理方法; 匿名内部类形式匿名内部类形式:使用匿名内部类创建事件监听器对象。 11 基于监听的事件处理基于监听的事件处理 内部类作为监听器的两个优势:内部类作为监听器的两个优势: 使用内部类监听器,可以方便在当前类中实现复用使
7、用内部类监听器,可以方便在当前类中实现复用; 可以自由访问外部类的所有界面组件(本身是类成员); 适合场景:适合于有多个事件源同时注册同一事件监听器的 情形。 12 基于监听的事件处理基于监听的事件处理 外部类作为监听器情况较少,原因:外部类作为监听器情况较少,原因: 事件监听器通常属于特定的事件监听器通常属于特定的GUI,定义成外部类不利于程,定义成外部类不利于程 序的内聚性序的内聚性; 外部类监听器不能自由访问创建GUI中的组件,逻辑上容 易产生混乱; 适合场景:适合于有多个GUI需要共享同一事件监听器的情 形。 内部类及外部类监听器例子演示 13 基于监听的事件处理基于监听的事件处理 A
8、ctivityActivity本身作为监听器的优缺点:本身作为监听器的优缺点: 形式较为简洁形式较为简洁; 但容易产生程序混乱,因为Activity的主要作用是进行界面 初始化,如果要处理事件,则会显得逻辑功能逻辑功能不清晰; 适合场景:程序功能非常简单的情形,初学者练习。 14 基于监听的事件处理基于监听的事件处理 匿名内部类监听器的优点:匿名内部类监听器的优点: 形式简洁,逻辑清晰形式简洁,逻辑清晰; 大部分事件监听器只是临时使用一次,采用匿名内部类监 听器更合适; 适合场景:目前使用最广泛的监听器形式。 匿名内部类及Activity作为监听器练习 SendSms例子讲解 plane例子讲
9、解 15 基于监听的事件处理基于监听的事件处理 常见事件监听器接口及其处理方法:常见事件监听器接口及其处理方法: No.事件事件接口接口处理方法处理方法描述描述 1单击事件View.OnClickListenerpublic abstract void onClick (View v)单击组件时触发 2单击事件View.OnLongClickListener public abstract boolean onLongClick (View v) 长按组件时触发 3键盘事件View.OnKeyListener public abstract boolean onKey (View v, int
10、 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.OnCreateContextMenuList ener public abstract void On
11、CreateContextMenu (ContextMenu menu, View v, ContextMenu. ContextMenuInfo menuInfo) 当上下文菜单创 建时触发 16 基于监听的事件处理基于监听的事件处理 ViewView类的常见事件注册方法:类的常见事件注册方法: No.方法方法类型类型描述描述 1public void setOnClickListener(View.OnClickListener l)普通注册单击事件 2public void setOnLongClickListener(View.OnLongClickListener l)普通注册长按事
12、件 3public void setOnKeyListener(View.OnKeyListener l)普通注册键盘事件 4 public void setOnFocusChangeListener(View.OnFocusChangeListener l) 普通注册焦点改变事件 5public void setOnTouchListener(View.OnTouchListener l)普通注册触摸事件 6 public void setOnCreateContextMenuListener( View.OnCreateContextMenuListener l) 普通 注册上下文菜单事
13、件 17 直接绑定到标签直接绑定到标签 Android提供了一种直接在界面布局文件中为指定标签绑定 事件处理方法机制。对于很多Android界面组件标签而言,它 们都支持如onClick、onLongClick等属性,这种属性的属性值 就是一个形如xxx(View source)方法的方法名。 例如在布局文件中为组件添加单击事件的处理方法如下所示: BingingTag例子讲解 18 基于监听的事件处理基于监听的事件处理 实现事件监听器的四种形式实现事件监听器的四种形式程序程序( (练练 习习) ) 19 事件处理的传播事件处理的传播 如果说事件监听机制是一种委托式的事件处理,那么 回调机制则
14、与之相反,对于基于回调的事件处理模型来 说,事件源和事件监听器是统一的,或者说事件监听器 完全消失了,当用户在GUI组件上激发某个事件时,组 件自己特定的方法将会负责处理该事件。 为了使用回调机制类来处理GUI组件上所发生的事件, 需要为该组件提供对应的事件处理方法,而Java又是一 种静态语言,我们无法为每个对象动态地添加方法,因 此只能通过继承GUI组件类,并重写该类的事件处理方 法来实现。 20 基于回调的事件处理基于回调的事件处理 ViewView类包含的主要回调方法:类包含的主要回调方法: nboolean onKeyUp (int keyCode, KeyEvent event):
15、该方 法用于捕捉手机键盘按键抬起的事件; nboolean onTouchEvent (MotionEvent event):该方法在 View类中定义,该方法用于处理手机屏幕的触摸事件,包 括屏幕被按下、屏幕被抬起、在屏幕中拖动。 Android为所有GUI组件都提供了一些基本的事件处理回调 方法,以View 组件为例。 21 基于回调的事件处理基于回调的事件处理 ViewView类包含的主要回调方法:类包含的主要回调方法: nboolean onKeyDown (int keyCode, KeyEvent event): 该方法是接口KeyEvent.Callback中的抽象方法,该方法
16、用于捕捉手机键盘被按下的事件。keyCode为被按下的 键值即键盘码,event为按键事件的对象,其中包含了触 发事件的详细信息,例如事件的状态、类型、发生的时 间等。当用户按下按键时,系统会自动将事件封装成 KeyEvent对象供应用程序使用。 22 事件处理的传播事件处理的传播 几乎所有基于回调的事件处理方法都有一个boolean类型 的返回值,该返回值用于标识该处理方法是否能完全处理 该事件。如果处理事件的回调方法返回true,表明该处理 方法已完全处理该事件,该事件不会传播出去;如果处理 事件的回调方法返回false,表明该处理方法并未完全处理 该事件,该事件会传播出去。 对于基于回调
17、事件传播而言,某组件上所发生的事情不 仅激发该组件上的回调方法,也会触发该组件所在Activity 的回调方法(前提是事件能传播到前提是事件能传播到Activity)。 23 事件处理的传播事件处理的传播 练习:练习:自定义一个按钮,重写其按下的回调方法、为其自定义一个按钮,重写其按下的回调方法、为其 注册按下事件监听器并重写它所在注册按下事件监听器并重写它所在Activity上的按下回上的按下回 调方法,观察事件处理顺序调方法,观察事件处理顺序(修改修改huidiao程序程序-onClick- true)。 如何在布局文件中配置自定义的组件?如何在布局文件中配置自定义的组件? 做一做:做一做
18、:改变方法的返回值(将改变方法的返回值(将true改为改为false),), 观察控制台输出结果。观察控制台输出结果。 24 事件处理的传播事件处理的传播 1、先触发的是该组件所绑定的事件监听器;、先触发的是该组件所绑定的事件监听器; 2、触发该组件提供的事件回调方法;、触发该组件提供的事件回调方法; 3、传播到该组件所在的、传播到该组件所在的Activity。如果我们让任何一个事。如果我们让任何一个事 件处理方法返回了件处理方法返回了true,那么该事件将不会继续向外传,那么该事件将不会继续向外传 播。播。 当为同一组件,既采用监听模式,同时又采用回调模式,当为同一组件,既采用监听模式,同时
19、又采用回调模式, 并且重写了该组件所在并且重写了该组件所在Activity对应的回调方法,而且对应的回调方法,而且 程序没有阻止事件传播,即每个方法都返回为程序没有阻止事件传播,即每个方法都返回为false。那。那 么么Android系统的调用顺序是什么呢?系统的调用顺序是什么呢? 25 Handler消息传递机制消息传递机制 Android平台不允许Activity新启动的线程访问该Activity里 的界面组件,这样就会导致新启动的线程无法动态改变界面组 件的属性值。但在实际Android应用开发中,尤其是涉及动画 的游戏开发中,需要让新启动的线程周期性地改变界面组件的 属性值,这就需要借
20、助于Handler的消息传递机制实现。 26 Handler消息传递机制消息传递机制 Handler类主要有两个作用:类主要有两个作用: 在新启动的线程中发送消息; 在主线程中获取、处理消息。 那么新启动的线程何时发送消息?主线程又如何去获取那么新启动的线程何时发送消息?主线程又如何去获取 并处理消息呢?并处理消息呢? 为了让主线程能“适时”地处理新启动的线程所发送的 消息,显然只能通过回调的方式来实现我们只要重写 Handler类中处理消息的方法,当新启动的线程发送消息 时,Handler类中处理消息的方法被自动回调。 27 Handler消息传递机制消息传递机制 HandlerHandle
21、r类的常用方法:类的常用方法: 方法签名描 述 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
22、boolean post (Runnable r)将一个线程添加到消息队列 28 开发带有开发带有HandlerHandler类的程序步骤:类的程序步骤: Step1Step1:创建Handler类对象,并重写handleMessage()方法; Step2Step2:在新启动的线程中,调用Handler对象的发送消息方法; Step3Step3:利用Handler对象的handleMessage()方法接收消息, 然后根据消息的不同执行不同的操作。 Handler消息传递机制消息传递机制 29 案例:案例:实现一个动态显示随机数的功能。实现一个动态显示随机数的功能。 Handler消息传递机
23、制消息传递机制 2、尝试通过子线程改变主线程界面; 1、尝试直接在主线程中实现该功能; 3、使用Handler处理机制实现该功能。 HandlerExam2例子讲解 30 异步任务处理异步任务处理 AsyncTask类一般用来处理一些后台比较耗时的任务,编程 语法显得优雅许多,通过后台线程执行异步任务,并把操作 结果通知给前台UI线程,不再需要子线程和Handler就可以 完成异步操作并刷新页面。zk AsyncTask是抽象类,定义了三种泛型类型 Params、 Progress和Result。 Params:启动任务执行的输入参数,比如HTTP请求的URL; Progress:后台任务执行
24、的百分比; Result:后台执行任务最终返回的结果,比如String,Integer 等。 31 异步任务处理异步任务处理 onPreExecute():该方法将在执行实际的后台操作前被UI线程线程调 用。可以在该方法中做一些准备工作,如在界面上显示一个进度 条,或者一些控件的实例化,这个方法可以不用实现。 doInBackground(Params.):将在onPreExecute 方法执行后 马上执行,该方法运行在后台线程后台线程中。这里将主要负责执行那些 比较耗时的后台处理工作。可以调用 publishProgress方法来实 时更新任务进度。该方法是抽象方法,子类必须实现。该方法是抽象方法,子类必须实现。 AsyncTaskAsyncTask类中主要方法:类中主要方法: 32 异步任务处理异步任务处理 onProgressUpd
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年刑法与刑事诉讼法考试试卷及答案
- 2025年数学分析与高等代数考试试卷及答案
- 2025年商业经济学与管理专业知识测试试卷及答案
- 2025年计算机网络与安全考试试卷及答案解析
- 2025年个人理财与投资基础知识考试题及答案
- 以坚强为话题的演讲稿12篇
- 配电箱采购合同协议书详细
- 词语辨析与运用:七年级英语词汇教学方法研究
- 《数字孪生技术及应用》课件 第五章 机器人应用
- 护理专业急救护理技能测试卷
- 江苏省南京2022年中考历史试卷(解析版)
- 《老年人认知记忆训练》课件
- 一年级家长会课件2024-2025学年
- 沪教版八年级化学(下册)期末试卷及答案
- 2024年广东省中考生物+地理试卷(含答案)
- DL-T5796-2019水电工程边坡安全监测技术规范
- 一年级下-科学-非纸笔测试
- 上海地理会考复习
- 设施设备检查记录表
- 油漆安全技术说明书msds
- 小学数学一年级《求一个数比另一个数多几、少几》说课稿
评论
0/150
提交评论