Android事件处理的两种模型

Android事件处理的两种模型:回调模型和订阅/发布模型 回调模型通过注册回调函数来处理事件,简单直观,适用于处理简单的事件。订阅/发布模型通过订阅者接收事件通知并处理事件,灵活性高,适用于处理复杂的事件处理逻辑。在Android中,有两种常用的事件处理模型:回调模型和订阅/发布模型。在Android应用程序中,事件处理的具体实现可能会有所不同,需要根据Android框架和相关API进行相应的调整和使用。然而,相对于回调模型而言,订阅/发布模型的实现可能会稍微复杂一些。然而,当应用程序变得复杂时,回调链的管理可能变得困难,并且容易导致代码的混乱和难以维护。 阅读详情

UI编程通常都会伴随事件处理,Android也不例外,它提供了两种方式的事件处理:基于回调的事件处理和基于监听器的事件处理。

对于基于监听器的事件处理而言,主要就是为Android界面组件绑定特定的事件监听器;对于基于回调的事件处理而言,主要做法是重写Android组件特定的回调函数,Android大部分界面组件都提供了事件响应的回调函数,我们主要重写它们就行。

一 基于监听器的事件处理

相比于基于回调的事件处理,这是更具“面向对象”性质的事件处理方式。在监听器模型中,主要涉及三类对象:

1)事件源Event Source:产生事件的来源,通常是各种组件,如按钮,窗口等。

2)事件Event:事件封装了界面组件上发生的特定事件的具体信息,如果监听器需要获取界面组件上所发生事件的相关信息,一般通过事件Event对象来传递。

3)事件监听器Event Listener:负责监听事件源发生的事件,并对不同的事件做相应的处理。

 

基于监听器的事件处理机制是一种委派式Delegation的事件处理方式,事件源将整个事件委托给事件监听器,由监听器对事件进行响应处理。这种处理方式将事件源和事件监听器分离,有利于提供程序的可维护性。

举例:

View类中的OnLongClickListener监听器定义如下:(不需要传递事件)

public interface OnLongClickListener {  
    boolean onLongClick(View v);  
}

View类中的OnLongClickListener监听器定义如下:(需要传递事件MotionEvent)

public interface OnTouchListener {  
    boolean onTouch(View v, MotionEvent event);  
}


二 基于回调的事件处理

相比基于监听器的事件处理模型,基于回调的事件处理模型要简单些,该模型中,事件源和事件监听器是合一的,也就是说没有独立的事件监听器存在。当用户在GUI组件上触发某事件时,由该组件自身特定的函数负责处理该事件。通常通过重写Override组件类的事件处理函数实现事件的处理。

举例:

View类实现了KeyEvent.Callback接口中的一系列回调函数,因此,基于回调的事件处理机制通过自定义View来实现,自定义View时重写这些事件处理方法即可。

public interface Callback {  
    // 几乎所有基于回调的事件处理函数都会返回一个boolean类型值,该返回值用于  
    // 标识该处理函数是否能完全处理该事件  
// 返回true,表明该函数已完全处理该事件,该事件不会传播出去  
// 返回false,表明该函数未完全处理该事件,该事件会传播出去  
       boolean onKeyDown(int keyCode, KeyEvent event);  
       boolean onKeyLongPress(int keyCode, KeyEvent event);  
       boolean onKeyUp(int keyCode, KeyEvent event);  
       boolean onKeyMultiple(int keyCode, int count, KeyEvent event);  
}


三 比对

基于监听器的事件模型符合单一职责原则,事件源和事件监听器分开实现;
某些特定情况下,基于回调的事件处理机制会更好的提高程序的内聚性。
Android的事件处理机制保证基于监听器的事件处理会优先于基于回调的事件处理被触发;


四 基于自定义监听器的事件处理流程

在实际项目开发中,我们经常需要自定义监听器来实现自定义业务流程的处理,而且一般都不是基于GUI界面作为事件源的。这里以常见的app自动更新为例进行说明,在自动更新过程中,会存在两个状态:下载中和下载完成,而我们的程序需要在这两个状态做不同的事情,“下载中”需要在UI界面上实时显示软件包下载的进度,“下载完成”后,取消进度条的显示。这里进行一个模拟,重点在说明自定义监听器的事件处理流程。

4.1)定义事件监听器如下:

public interface DownloadListener {  
    public void onDownloading(int progress); //下载过程中的处理函数  
    public void onDownloaded(); //下载完成的处理函数  
}

4.2)实现下载操作的工具类代码如下:

public class DownloadUtils {  
         
    private static DownloadUtils instance = null;  
         
    private DownloadUtils() {  
    }  
         
    public static synchronized DownloadUtils instance() {  
        if (instance == null) {  
            instance = new DownloadUtils();  
        }  
        return instance;  
    }  
         
    private boolean isDownloading = true;  
         
    private int progress = 0;
 // 实际开发中这个函数需要传入url作为参数,以获取服务器端的安装包位置  
    public void download(DownloadListener listener) throws InterruptedException {  
        while (isDownloading) {  
            listener.onDownloading(progress);  
            // 下载过程的简单模拟  
            Thread.sleep(1000);  
            progress += 10;  
            if (progress >= 100) {  
                isDownloading = false;  
            }  
        }  
        // 下载完成  
        listener.onDownloaded();  
    }  
         
}

4.3)最后在main函数中模拟事件源:

public class DownloadUI {  
            
    public static void main(String[] args) {  
        try {  
            DownloadUtils.instance().download(new MyDownloadListener());  
        } catch (InterruptedException e) {  
            e.printStackTrace();  
        }  
    }  
 private static class MyDownloadListener implements DownloadListener {  
        
        @Override
        public void onDownloading(int progress) {  
            System.out.println("下载进度是:" + progress);  
        }  
        
        @Override
        public void onDownloaded() {  
            System.out.println("下载完成");  
        }  
                
    }   
        
}

原文地址:http://iandroiddev.com/post/2012-05-24/21987397
行人检测实战:三格式标签转换与YOLO11多平台训练全流程 目标检测是计算机视觉的核心任务,行人检测作为典型应用,在智慧交通、安防监控等领域需求广泛。数据集标注格式(VOC/COCO/YOLO)是模型训练的前提,理解三种格式的坐标换算与归一化原理,能有效避免标签错位和“带病学习”问题。YOLO11作为高效检测框架,提供跨GPU/CPU/Mac的迁移训练能力,配合小目标与遮挡样本的分布分析,可显著提升模型在复杂场景下的鲁棒性。实际工程中,从1000张行人图像起步,需要关注场景分布、标注一致性与训练参数调整,并利用自动化脚本完成格式统一和三平台适配。本文围绕数据选型、标 阅读详情

相关推荐

android获取监听SD Card状态的方法

本文实例讲述了android获取监听SD Card状态的方法。分享给大家供大家参考。具体分析如下: 1. 注册StorageEventListener来监听SD卡状态即onStorageStateChanged()方法,当sd卡状态改变时,调用该方法。 代码如下:public void onStorageStateChanged(String path,String oldState,String newState){ if (newState.equals(Environment.MEDIA_SHARED)) //大容量存储 { ///////////////// } else if (n

Android R PointerEventDispatcher 触摸事件监听帮助类

文章托管在gitee上 Android Notes , 同步csdn PointerEventDispatcher 介绍 PointerEventDispatcher类的功能如同名字描述的那样,它是一个触摸事件分发类. 使用者通过registerInputEventListener(PointerEventListener listener) 方法向它注册事件监听,当有事件到来时,它的onInputEvent(InputEvent event)方法会被调用到, 然后将事件分发给所有的监听者. 当不需要监.

pecuyu 3828

课程复习---分析空间数据的细胞空间关系(python版本的mistyR)

课程复习---分析空间数据的细胞空间关系(python版本的mistyR)

weixin_53637133的博客 1221

【framework】DisplayContent简介

1 前言 DisplayContent 用于管理屏幕,一块屏幕对应一个 DisplayContent 对象,虽然手机只有一个显示屏,但是可以创建多个 DisplayContent 对象,如投屏时,可以创建一个虚拟的 DisplayContent。 关于其父类及祖父类的介绍,见→WindowContainer简介、ConfigurationContainer简介,其父容器的介绍见→RootWindowContainer简介。 2 源码 (1)类定义 //DisplayChildWindowC.

little_fat_sheep 4779

华为AC外置Portal认证方案配置步骤指南

华为AC外置Portal认证方案配置步骤指南

m0_46129105的博客 7665

Gerrit 使用操作手册

Gerrit是一种免费、开源的代码审查工具,使用网页交互页面。这个软件的名称来自于荷兰设计师师赫里特·里特费尔德(GerritRietveld),作者为Google公司的ShawnPearce。它使用Git作为底层版本控制系统,相比于其他的代码管理工具,Gerrit明显的特色是代码审核。利用网页浏览器,同一个团队的软件程序员,可以相互审核(Review)彼此修改后的程序代码,然后决定是继续提交还是取消提交。...

九离的博客 1万+

39. 【Android教程】触摸事件分发

用户在使用 Andriod 系统的时候会不断的和我们的 App 进行各种类型的交互(类似点击、滑动等等),“事件”就是一个非常有效的用来收集用户行为的方式。在前面章节有提到过:Android 系统采用一个先进先出(FIFO)队列来维护一个事件 List。在每个事件出列的时候,Android 系统会根据一定的规则对这些事件做分发,我们可以通过接收这些事件来对用户的操作进行相应的处理。

这是一个web全栈开发的博客,取其精华去其糟粕,争取让大家一看就懂,一学就会,一用就成~ 1195

【ComfyUI】Animate 保留原视频背景角色替换视频生成

本文介绍了智能创作与视频生成的工作流设计,强调其作为围绕业务目标、数据流转和模型能力的有机整体。工作流由数据输入、模型处理、结果合成和输出展示构成,通过节点化连接实现高效复用与扩展。文章重点解析了核心模型(如CLIP Vision、WanVideo等)的功能和协作方式,以及各类节点(输入、处理、控制、输出)的作用。最后展示了工作流在视频角色替换、虚拟试衣等场景的应用价值,并提供了相关开发资源链接。该设计通过模块化实现了灵活适配不同业务需求的能力。

Mr数据杨 1862

Android 11 定制系统全局监听触摸事件接口

3.剩下就是在frameworks\base\services\core\java\com\android\server\wm\WindowManagerService.java。2.新增调用接口 在 base/core/java/android/view/IWindowManager.aidl。1.定义创建aidl接口(由于需要回调这里优先需要增加一个回调接口 )由于此版本是针对Android11 做的定制!你们的肯定是我写下去的动力!全局监听接口定制就实现完成!......

a546036242的博客 3590

YOLO11改进:轻量级改进 | 通用倒瓶颈(UIB)搜索块结合C3k2二次创新 | 轻量化之王MobileNetV4

通用倒瓶颈(UIB)搜索块替代YOLO11的C3k2

会AI的学姐 292

YOLOv11 改进 - 注意力机制 | Deformable-LKA 可变形大核注意力:自适应采样网格优化特征捕捉,提升不规则目标感知

本文介绍了可变形大核注意力(D-LKA Attention)及其在YOLOv11中的结合。D-LKA Attention是一种简化的注意力机制,采用大卷积核利用体积上下文信息,通过可变形卷积灵活调整采样网格,适应多样数据模式。它有2D和3D版本,3D版本在跨深度数据理解上表现出色,共同构成了D-LKA Net架构。我们将D-LKA Attention集成进YOLOv11,在模型的检测头部分引入deformable_LKA_Attention模块。实验表明,该方法在分割任务上表现优于现有方法,提升了模型的检测

魔改工程师的博客 1170

Android事件处理的两种模型介绍

Android事件处理的两种模型 UI编程通常都会伴随事件处理,Android也不例外,它提供了两种方式的事件处理:基于回调的事件处理和基于监听器的事件处理。 对于基于监听器的事件处理而言,主要就是为Android界面组件绑定特定的事件监听器;对于基于回调的事件处理而言,主要做法是重写Android组件特定的回调函数,Android大部分界面组件都提供了事件响应的回调函数,我们主要重写

lgzaaron的博客 693

4.Simulink基础建模操作——加减乘除运算

加减乘除运算

FPGA/MATLAB学习教程/源码/项目合作开发 9549
上一篇: Android动画
下一篇: Android触屏事件流
coding_or_coded
博客等级 码龄16年 216粉丝 115原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值