热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

详解Android的两种事件处理机制

这篇文章主要介绍了详解Android的两种事件处理机制,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。

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

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

一 基于监听器的事件处理

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

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

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

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

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

举例:

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

public interface OnLongClickListener { 

  boolean onLongClick(View v); 

} 

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

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

public interface OnTouchListener { 

  boolean onTouch(View v, MotionEvent event); 

} 

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); 

} 

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 porgress);//下载过程中的处理函数
  public void onDownload();//下载完成的处理函数
}

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

public class DownloadUtils{
  private static DownloadUtils instance=null;
  private private(){
  }
  public static synchronized DownloadUtils instance(){
   if(instance==null){
   instance=new DownloadUtils();
   }
   returns instance;
  } 
}
private boolean is Downloading=ture;
private int progress=0;
//实际开发中这个函数需要传人url作为参数,以获取服务器端安装包位置

public void download(DownloadListener listener)throws interruptdeException{
while (isDownloading){
     listener.onDownloading(progress);
     //下载过程的简单模拟
 Thread.sleep(1000);
     progress+=10;
  if(progress>=100){
  isDownloading=false;
 
  }
}
//下载完成
listener.onDownload();
}
}

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

public class DownloadUI{
  public static void main(sting[] args){
     try{
   DownloadUtils.instance().download(new MyDownloadListener());
 }catch(InterruptedExceptiob 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("下载完成")
}
 }
}

运行一下的模拟程序,输入如下所示:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • 短信验证码安全性堪忧,多因素认证或成未来主流
    短信验证码安全性堪忧,多因素认证或成未来主流 ... [详细]
  • 深入解析 Java 程序的执行机制与运行流程
    本文深入探讨了Java程序的执行机制与运行流程,详细解析了从源代码编译到字节码生成,再到JVM加载和执行的全过程。通过实例分析,读者可以更好地理解Java虚拟机的工作原理及其在实际开发中的应用。 ... [详细]
  • 本文深入解析了Django框架中的MVT(Model-View-Template)设计模式,详细阐述了其工作原理和应用流程。通过分析URL模式、视图、模型和模板等关键组件,读者将全面理解Django应用程序的架构体系,掌握如何高效地构建和管理Web应用。 ... [详细]
  • 本文分享了一个用于检测Dota 2服务器延迟的脚本,并提供了优化建议。该脚本基于Franzmeister对原始PlanetSide 2 ping测试代码的修改,能够有效帮助玩家监测游戏连接质量,提升游戏体验。此外,文中还详细介绍了如何配置和使用该脚本,以及常见的网络优化技巧,以进一步降低延迟和提高稳定性。 ... [详细]
  • 世事难料:昔日辉煌的行业巨头,如今却依附他人
    近日,一条不太引人注目的新闻引起了我的注意,标题是《谷歌在硅谷豪掷巨资购地,甚至买下雅虎总部》。虽然这则消息并未让我惊叹于谷歌的财力雄厚,毕竟其当前的市场地位早已证明其实力,但更让人唏嘘的是,曾经风光无限的行业巨头雅虎,如今却沦落到被收购的地步。这一变化不禁令人感叹,商业世界的风云变幻,昔日的辉煌可能转瞬即逝。 ... [详细]
  • 将Jar包部署至Linux服务器的详细步骤与注意事项
    将Jar包部署至Linux服务器的详细步骤及注意事项包括:首先使用 `mvn install` 命令进行Jar包的打包构建。接着,需要停止当前正在运行的Jar进程,可以通过 `ps -ef | grep **.jar` 查找对应的进程ID(PID),然后使用 `kill -9 ` 终止该进程。最后,使用 `rm` 命令删除旧的Jar包文件,确保新版本能够顺利部署。在整个过程中,务必确保操作的准确性和安全性,避免对服务器造成不必要的影响。 ... [详细]
  • PHPCMS全站迁移时URL地址的更新与替换策略 ... [详细]
  • Oracle字符集详解:图表解析与中文乱码解决方案
    本文详细解析了 Oracle 数据库中的字符集机制,通过图表展示了不同字符集之间的转换过程,并针对中文乱码问题提供了有效的解决方案。文章深入探讨了字符集配置、数据迁移和兼容性问题,为数据库管理员和开发人员提供了实用的参考和指导。 ... [详细]
  • 脑机接口技术在物联网行业中的应用与前景分析
    近期,国际研究人员开发了一种轻便的脑电图(EEG)采集与信号处理系统,并在物联网领域进行了初步应用研究。该系统配备了8个可扩展的采集电极和1个参考电极,具备高灵敏度的放大功能,能够有效捕捉和处理脑电信号。通过与物联网技术的结合,该系统有望在智能家居、健康监测和人机交互等领域发挥重要作用,展现出广阔的应用前景。 ... [详细]
  • 深入解析 OpenSSL 生成 SM2 证书:非对称加密技术与数字证书、数字签名的关联分析
    本文深入探讨了 OpenSSL 在生成 SM2 证书过程中的技术细节,重点分析了非对称加密技术在数字证书和数字签名中的应用。非对称加密通过使用公钥和私钥对数据进行加解密,确保了信息传输的安全性。公钥可以公开分发,用于加密数据或验证签名,而私钥则需严格保密,用于解密数据或生成签名。文章详细介绍了 OpenSSL 如何利用这些原理生成 SM2 证书,并讨论了其在实际应用中的安全性和有效性。 ... [详细]
  • 如何有效防御网站中的SQL注入攻击
    本期文章将深入探讨网站如何有效防御SQL注入攻击。我们将从技术层面详细解析防范措施,并结合实际案例进行阐述,旨在帮助读者全面了解并掌握有效的防护策略。希望本文能为您的网络安全提供有益参考。 ... [详细]
  • 如何在Windows 10系统中正确安装Xbox控制器? ... [详细]
  • 本指南详细介绍了在Linux环境中高效连接MySQL数据库的方法。用户可以通过安装并使用`mysql`客户端工具来实现本地连接,具体命令为:`mysql -u 用户名 -p 密码 -h 主机`。例如,使用管理员账户连接本地MySQL服务器的命令为:`mysql -u root -p pass`。此外,还提供了多种配置优化建议,以确保连接过程更加稳定和高效。 ... [详细]
  • 阿里云MySQL与Oracle数据库的主从复制技术详解 ... [详细]
  • 在CICS应用环境中,众多客户端通过网络与CICS服务器进行连接。系统管理员可以通过CICS系统交易CEMT查询当前连接的客户端信息。然而,在非客户端模式下,识别用户连接并解决信息获取错误的问题变得更为复杂。本文将探讨如何在CICS服务器端准确识别非客户端模式的用户连接,并提供有效的解决方案,以确保系统的稳定性和数据的准确性。此外,还将介绍一些常用的诊断工具和技术,帮助管理员快速定位和解决问题。 ... [详细]
author-avatar
宗瑋婉君珮璇
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有