【Android学习笔记】事件处理

news/2024/11/7 9:34:47/

>事件处理的概述

  • 两种事件处理机制

    1. 基于监听的事件处理

    2. 基于回调的事件处理

>基于监听的事件处理机制

  • 涉及到的三类对象

    1. Event Source事件源,指各个组件。

    2. Event 界面组件上发生的特定的事情,。

    3. Event Listener监听事件源发生的事情。并对各种事情作出相应的响应。

    4. Event
      Handler事件处理器,当事件监听器捕获事件后,由响应的事件处理器识别特定的事件,并做出响应的动作。

  • 事件监听机制的工作流程

普通组件(事件源对象) 发生很多事件,生成多种事件对象 被同一个监听器对象捕获
监听器通过不同的事件处理器处理这个事件。

每个组件可以根据不同的事件类别指定多个监听器,每一个监听器可以监听多个事件源。

>实现事件监听器的方法

  1. 内部类作为时间的监听器

使用内部类作为事件监听器能够在这个类内复用该监听器。该监听器类能够自由访问外部类的所有界面组件

  1. 外部类作为时间监听器

事件监听器通常属于特定的GUI界面,定义成外部类不利于提高程序的内聚性。外部类形式的时间监听器不能够自由访问GUI界面的类中的组件。同时也适用于监听器于GUI界面没有任何耦合情况。

监听器还是主要来写显示逻辑,具体的业务逻辑放到外部的其他函数或者类中进行处理。

Activity类本身作为事件监听器

不推荐,activity类本身用来界面初始化工作,包含事件监听器容易造成程序的逻辑结构混乱。

匿名类作为时间监听器类

大部分时候事件监听器类的代码没有什么复用价值,所以只要使用匿名类来实现事件监听器想要达到的页面逻辑就好。

android可以直接在界面布局中制定标签绑定事件的处理方式。

android:onClick=”clickHandler”

>基于回调的事件处理方法

  • 回调机制

事件的处理直接绑定到与组件相关的时间处理函数上,而非通过监听器的监听和事件处理器的匹配处理。有点像事件监听器和事件源融合在一起,不需要单独的时间监听器类,事件源本身能够监听自身发生的各种事件。

  • 基于回调的事件传播

当返回为true时,表明该方法已经能够处理发生的事件,事件不会向外传播给外层的时间监听器。当返回为false时,如果有外围的监听器处理同一个事件,则事件会向外传播,同时被其他监听器坚挺到。如果存在各种监听器,其监听顺序为:绑定的事件监听器–>基于回调的内部事件监听器–>基于回调的外部事件监听器。

>相应系统设置的事件

  • 用来获取系统的配置

Configuration cfg = getResources().getConfiguration();

  • onConfigurationChanged能够监听相关的配置改变的事件。

>Handler消息传递机制

  • 工作原理

android第一次启动,主线程负责activityUI界面的线程,而且只允许UI线程对主界面进行修改,其他新启动的线程无法对主界面进行直接修改,需要使用Handler进行消息传递。

  • Handler简介

    1. 在新启动的线程中发送消息

    2. 在主线程中获取和处理消息

      好像是原来的事件处理机制变成了消息处理机制,通过监听消息,处理消息完成一系列动作,同事件处理一样。

  • Handler涉及的方法

    1. HandlerMessage()

    2. hasMessage()

    3. hasMessages()

    4. obtainMessage()

    5. sendEmptyMessage()

    6. sendEmptyMessageDelayed()

    7. sendMessage()

    8. sendMessageDelayed()

  • Handler、Loop、MessageQueue的工作原理

    1. Message是Handler接受和处理的对象

    2. Looper每个线程只能有一个Looper,loop方法负责读取MessageQueue中的消息

    3. MessageQueen消息队列,采用了先进先出的方式管理队列。

private Looper() { mQueue = new MessageQueue(); mRun = true; mThread =
Thread.currentThread(); }

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • Looper类的使用方法

    1. 调用Looper的prepare方法,创建Looper对象,生成对应的MessageQueue来管理事件

    2. 创建Handler子类,用于发送本线程的消息。重写HandlerMessage方法,负责处理来自其他线程的消息。

    3. 调用Looper的loop方法启动Looper类

      UI线程一般专门用来相应用户的界面操作,而其他的逻辑运算和处理都交给其他线程处理主要目的是防止UI线程被阻塞而让用户以为界面卡顿。

      此时如果UI线程与其他线程的交互方式,就是Handler消息传递机制,同事件监听机制的逻辑十分相似。

>异步任务

  • 解决新线程不能更新UI主界面的问题的方法

    • 使用Handler消息处理机制

    • Activity.runOnUiThread(Runnable)

    • View.post(Runnable)

    • View.postDelayed(Runnable,long)

    • 异步处理机制

  • AsyncTask


http://www.ppmy.cn/news/698581.html

相关文章

标准C++05

标准C 一、运算符函数 在C中会把运算符当做函数处理,一个表达式,其实是调用了很多的运算符函数完成计算, 这种特性对于内建类型是没有意义的,但是对于自建类型的数据,可以进行个性化设计,,可以大大地提高…

2021年蓝桥杯C/C++B组F题-123

目录 2021年蓝桥杯C/CB组F题-123 题目 2618: 蓝桥杯2021年第十二届国赛真题-123 解题思路: 2021年蓝桥杯C/CB组F题-123 题目链接:蓝桥杯2021年第十二届国赛真题-123 - C语言网 题目 2618: 蓝桥杯2021年第十二届国赛真题-123 时间限制: 1Sec 内存限…

COMSOL等离子体模块电子碰撞反应速率系数与Bolsig+计算结果差异及修正

数据准备: (1)comsol等离子体仿真模型 ( 包含N2和O2电子碰撞反应以及化学反应) (2)air_chemistry_v3.txt : 该数据是afivo-streamer等离子体仿真项目中提供的输运数据(transport da…

《MySQL 必知必会》C25-C28

文章目录 第二十五章 使用触发器1 触发器2 创建触发器3 删除触发器4 使用触发器(1) insert触发器(2) delete触发器(3) update触发器 5 进一步了解触发器 第二十六章 管理事物处理1 事物处理2 控制事物处理(1) 使用rollback(2) 使用commit(3) 使用保留点(4) 更改默认的提交行为 …

JLINK驱动、接线、接口模式、硬件都没问题,JLINK仍然读不到芯片的解决办法

今天遇到一个奇葩的问题,JINK驱动、接线、模式设置,硬件啥都没有问题,就是JINK连不到芯片,读不到芯片。自己平时都是用SWD模式,然后直接JLINK的GND 、SWDIO、SWCLK直接接上,一般我不会接VCC,应该…

类变量和类方法的基本使用

什么是类变量 类变量也叫静态变量/静态属性,是该类的所有对象共享的变量,任何一个该类的对象访问它时,取到的都是相同的值,同样任何一个该类的对象去修改它时,修改的也是同一个变量。 如何定义类变量 定义语法&…

15-VMware Horizon 2203 虚拟桌面-Win10 自动桌面池完整克隆浮动(十五)

系列文章目录 0-VMware Horizon 2203 虚拟桌面-目录大纲 1-VMware Horizon 2203 虚拟桌面-AD域控(一) 2-VMware Horizon 2203 虚拟桌面-SQL部署(二) 3-VMware Horizon 2203 虚拟桌面-Connect标准服务器(三) 4-VMware Horizon 2203 虚拟桌面-Connect副本服务器(四)…

云端3d虚拟现实展制作

受疫情持续影响,3D虚拟云展厅加速进入大众的生活。在实体经济下滑的情势之下,3D虚拟云展厅无疑是最好的一种选择。“互联网”打造,“3D数字化转型”升级成为时下流行的名词。疫情期间,”线上博物馆“、”线上看展“、”线上广交会…