一、基于监听的事件处理机制

  1. 基于监听的时间处理机制模型:

事件监听机制中由事件源,事件,事件监听器三类对象组成 处理流程如下:

Step 1:为某个事件源(组件)设置一个监听器,用于监听用户操作

Step 2:用户的操作,触发了事件源的监听器

Step 3:生成了对应的事件对象

Step 4:将这个事件源对象作为参数传给事件监听器

step 5:事件监听器对事件对象进行判断,执行对应的事件处理器(对应事件的处理方法)

  1. 五种不同的使用形式

1)       直接使用匿名内部类

平时最常用的一种:直接setXxxListener后,重写里面的方法即可; 通常是临时使用一次,复用性不高!

2)       使用内部类

和上面的匿名内部类不同哦! 使用优点:可以在该类中进行复用,可直接访问外部类的所有界面组件!

3)       使用外部类

另外创建一个处理事件的Java文件,这种形式用的比较少!因为外部类不能直接访问用户界面类中的组件,要通过构造方法将组件传入使用;这样导致的结果就是代码不够简洁!

4)       直接使用Activity作为事件监听器

让Activity类实现XxxListener事件监听接口,在Activity中定义重写对应的事件处理器方法 eg:Actitity实现了OnClickListener接口,重写了onClick(view)方法在为某些组建添加该事件监听对象时,直接setXxx.Listener(this)即可

5)       直接绑定到标签

直接在xml布局文件中对应得Activity中定义一个事件处理方法 eg:public void myClick(View source) source对应事件源(组件) ,接着布局文件中对应要触发事件的组建,设置一个属性:onclick = "myclick"即可

二、基于回调的事件处理机制

当发生点击事件后不需要我们在Java文件中进行事件监听器的绑定就可以完成回调,即组件会处理对应的事件,即事件由事件源(组件)自身处理!

  1. 回调方法

1)       将功能定义与功能分开的一种手段,一种解耦合的设计思想;

2)       在Java中回调是通过接口来实现的, 作为一种系统架构,必须要有自己的运行环境,且需要为用户提供实现接口;

3)       实现依赖于客户,这样就可以达到接口统一,实现不同;

4)       系统通过在不同的状态下“回调”我们的实现类,从而达到接口和实现的分离!

  1. 两个使用场景

1)       自定义View(组件)

当用户在GUI组件上激发某个事件时,组件有自己特定的方法会负责处理该事件。

通常用法:继承基本的GUI组件,重写该组件的事件处理方法,即自定义View 。

常见View的回调方法:

①   在该组件上触发屏幕事件: boolean onTouchEvent(MotionEvent event);

②   在该组件上按下某个按钮时: boolean onKeyDown(int keyCode,KeyEvent event);

③   松开组件上的某个按钮时: boolean onKeyUp(int keyCode,KeyEvent event);

④   长按组件某个按钮时: boolean onKeyLongPress(int keyCode,KeyEvent event);

⑤   键盘快捷键事件发生::boolean onKeyShortcut(int keyCode,KeyEvent event);

⑥   在组件上触发轨迹球屏事件: boolean onTrackballEvent(MotionEvent event);

⑦   当组件的焦点发生改变,和前面的6个不同,这个方法只能够在View中重写哦! protected void onFocusChanged(boolean gainFocus, int direction, Rect previously FocusedRect)

注意:在xml布局中使用自定义的view时,需要使用“全限定类名”

2)       基于回调的事件传播

View的回调方法的返回值都是boolean类型,返回值是用来标识这个方法是否已经完全处理完该事件。如果为false的话,说明没处理完,那么就传播出去,出发组件所在的Activity的相关回调方法;为true就不会传播。

事件的传播顺序:监听器--->view组件的回调方法--->Activity的回调方法

三、Handler消息传递机制

Handler的使用:

  1. Handler写在主线程中

在主线程中,因为系统已经初始化了一个Looper对象,所以我们直接创建Handler对象,就可以进行信息的发送与处理。

  1. Handler写在子线程中

如果是Handler写在了子线程中的话,我们就需要自己创建一个Looper对象了。创建的流程如下:

1 )     直接调用Looper.prepare()方法即可为当前线程创建Looper对象,而它的构造器会创建配套的MessageQueue

2 )     创建Handler对象,重写handleMessage( )方法就可以处理来自于其他线程的信息

3 )     调用Looper.loop()方法启动Looper

事件处理机制与Handler消息传递机制的更多相关文章

  1. Android中的消息机制:Handler消息传递机制

    参考<疯狂android讲义>第2版3.5 P214 一.背景 出于性能优化考虑,Android的UI操作并不是线程安全的,这意味着如果有多个线程并发操作UI组件,可能导致线程安全问题.为 ...

  2. Android中的消息机制:Handler消息传递机制 分类: H1_ANDROID 2013-10-27 22:54 1755人阅读 评论(0) 收藏

    参考<疯狂android讲义>第2版3.5 P214 一.背景 出于性能优化考虑,Android的UI操作并不是线程安全的,这意味着如果有多个线程并发操作UI组件,可能导致线程安全问题.为 ...

  3. Android学习笔记-事件处理之Handler消息传递机制

    内容摘要:Android Handler消息传递机制的学习总结.问题记录 Handler消息传递机制的目的: 1.实现线程间通信(如:Android平台只允许主线程(UI线程)修改Activity里的 ...

  4. 安卓开发_深入理解Handler消息传递机制

    一.概述 因为子线程的run()方法无法修改UI线程(主线程)的UI界面,所以Android引入了Handler消息传递机制,实现在新创建的线程中操作UI界面 二.消息类(Message) 消息类是存 ...

  5. Handler消息传递机制

    引言: 出于性能优化考虑,Android的UI操作并不是线程安全的,这意味着如果有多个线程并发操作UI组件,可能导致线程安全问题. 为了解决这个问题,Android制定了一条简单的规则:只允许UI线程 ...

  6. Android学习之Handler消息传递机制

    Android只允许UI线程修改Activity里的UI组件.当Android程序第一次启动时,Android会同时启动一条主线程(Main Thread),主线程主要负责处理与UI相关的事件,如用户 ...

  7. Handler消息传递机制——Handler、Loop、MessageQueue的工作原理

    为了更好地理解Handler的工作原理,先介绍一下与Handler一起工作的几个组件. Message:Handler接收和处理的消息对象. Looper:每个线程只能拥有一个Looper.它的loo ...

  8. Handler消息传递机制——Handler类简洁

    Handler类的主要作用有两个: 在新启动的线程中发送消息. 在主线程中获取.处理消息. 上面的说法很简单,只要分成两步即可:在新启动的线程中发送消息:然后在主线程上获取.并处理消息.但这个过程涉及 ...

  9. 3.3 线程---Handler消息传递机制浅析

    Handler的执行流程图: 当我们的子线程想修改Activity中的UI组件时,我们可以新建一个Handler对象,通过这个对象向主线程发送信息;而我们发送的信息会先到主线程的MessageQueu ...

随机推荐

  1. springboot+eureka+mybatis+mysql环境下报504 Gateway Time-out

    1.test环境下的数据库配置的 driver和url有问题, 在工程日志中的表现是不能打印出最新的日志,在部署前的日志能看到报错:

  2. 电脑串口(com)被占用问题

    最近使用串口与设备通信. 这个电脑一个有6个COM口,都要使用. 还有自带一个华为的4G通信模块,这个模块需要虚拟出4个COM口. 使用之前的Gost系统(只有1个物理COM版本的),导致物理COM口 ...

  3. 【图像处理 】 一、OSTU分割法

    图像中像素的灰度值小于阈值T的像素个数记作N0,像素灰度大于阈值T的像素个数记作N1,则有: 图像大小:M*N T为二值化的阈值: N0为灰度小于T的像素的个数,N0的平均灰度为μ0 N1 为灰度大于 ...

  4. 每日一句 Linux, 持续精进

    每日一句 Linux, 持续更新 2019.12.10 1.远程登录 linux 服务器.首先要按照ssh(win10默认是安装了的).命令行窗口,使用 ssh 登录名@serverIp,之后输入密码 ...

  5. pandas库的一些操作

    1.pd.value_count():带入数值可以计算出value有多少的类别 #得到类别的降序 tips['day'].value_counts(sort=True,ascending=True) ...

  6. P4151 最大XOR和路径 线性基

    题解见:https://www.luogu.org/problemnew/solution/P4151 其实就是找出所有环 把环上所有边异或起来得到的值扔到线性基里面 然后随便走一条从1~n的链 最后 ...

  7. java动态代理框架

             java动态代理是一个挺有意思的东西,他有时候可以被使用的很灵活.像rpc的调用,调用方只是定义的一个接口,动态代理让他匹配上对应的不同接口:mybatis内部的实现,编码时,只是实 ...

  8. string::capacity string::size string::length string::max_size

    size_t capacity() const noexcept; #include <iostream>#include <string> using namespace s ...

  9. Raid0、Raid0+1、Raid1、Raid5四者的区别

    RAID,可以把硬盘整合成一个大磁盘,还可以在大磁盘上再分区,放数据还有一个大功能,多块盘放在一起可以有冗余(备份)RAID整合方式有很多,常用的:0 1 5 10 Raid0Raid0是所有raid ...

  10. [译] 优化 WEBPACK 以更快地构建 REACT

    原文地址:OPTIMIZING WEBPACK FOR FASTER REACT BUILDS 原文作者:Jonathan Rowny 译文出自:掘金翻译计划 本文永久链接:https://githu ...