`
mmdev
  • 浏览: 12914771 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

Android事件处理的两种模型

 
阅读更多

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

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

一基于监听器的事件处理

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

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

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

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

基于监听器的事件处理机制是一种委派式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("下载完成");
		}
		
	} 

}

运行上面的模拟程序,输出如下所示:



五参考文献

1)《疯狂Android讲义》



分享到:
评论

相关推荐

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

    UI编程通常都会伴随事件处理,Android也不例外,它提供了两种方式的事件处理:基于回调的事件处理和基于监听器的事件处理。 对于基于监听器的事件处理而言,主要就是为Android界面组件绑定特定的事件监听器;对于...

    Android App软件行为信任模型研究

    首先介绍了Android平台的体系结构、运行机制以及现有的安全防御措施,然后分析对比了目前已提出的检测方法和机制的优缺点,接着在Android恶意程序特征提取的基础上,建立了一套有效的app恶意软件行为信任模型。...

    Android应用程序消息处理机制

    这个PPT讲Android应用程序线程消息循环原理,主要涉及到Handler和Looper两个类,以及根据消息循环的不同使用场景,总结出三种线程使用模型。掌握Android应用程序消息处理机制,有助于我们熟练地使用同步和异步编程,...

    Android 实现界面刷新的几种方法

    Android程序中可以使用的界面刷新方法有两种,分别是利用Handler和利用postInvalidate()来实现在线程中刷新界面。 利用Handler刷新界面 实例化一个Handler对象,并重写handleMessage方法调用invalidate()实现界面...

    Android代码-安卓设备展示STL 3D模型

    STl 两种文件格式 ASCII格式和二进制格式 STL格式简介 ASCII格式 ASCII码格式的STL文件逐行给出三角面片的几何信息,每一行以1个或2个关键字开头。 在STL文件中的三角面片的信息单元 facet 是一个带矢量方向的三角...

    android开发之界面设计2

    声明Android程序的界面布局有两种方法 使用XML文件描述界面布局 在程序运行时动态添加或修改界面布局 用户既可以独立使用任何一种声明界面布局的方式,也可以同时使用两种方式 Android SDK已经内置了几种简单的布局...

    新版Android开发教程.rar

    ----------------------------------- Android 编程基础 1 封面----------------------------------- Android 编程基础 2 开放手机联盟 --Open --Open --Open --Open Handset Handset Handset Handset Alliance ...

    Android studio版阿里云物联网平台设备接入源代码(简单易懂)

    设备接入给出了旧版公共实例(新版的可以在此基础上改动)和企业实例两种方式;订阅功能还给出来数据解析,可以从payload解析出物模型的每一项数据显示在Textview内;发布动能给出了可以从EditText输入数据,并且...

    基于深度学习YOLOv5和Android Studio开发的tt100k交通标志识别检测项目源码(含模型文件+APK).zip

    基于深度学习YOLOv5和Android Studio...5、APP可以打开前置和后置摄像头实时识别检测,另外可选择CPU和GPU两种推理 【备注】 1、该资源内项目代码都经过测试运行成功!!! 演示视频:https://live.csdn.net/v/372267

    基于OpenGL的Android+3D游戏开发技术详解与典型案例(源码)

    最后介绍了3D场景中常用的两种投影方式,并通过例子比较了这两种投影的区别  第5章 愿君多采撷,此物最相思—光照效果的开发本章介绍了光照的基础知识,包括环境光、散射光及镜面光  第6章 为伊消得人憔悴——纹理...

    精通ANDROID 3(中文版)1/2

    10.1 理解Android安全性模型  10.1.1 安全性概念概述  10.1.2 为部署签名应用程序  10.2 执行运行时安全性检查  10.2.1 进程边界上的安全性  10.2.2 声明和使用权限  10.2.3 理解和使用自定义权限  ...

    Android学习 ContentProvider数据更新与Observer模式.doc

    Android学习ContentProvider数据更新与Observer模式一Observer模式意图: 定义对象之间一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被更新。 依赖(Dependents)、发布-...

    Android中刷新界面的二种方法

    Android界面刷新方法有两种,分别是利用Handler和利用postInvalidate()来实现在线程中刷新界面。 利用Handler刷新界面 实例化一个Handler对象,并重写handleMessage方法调用invalidate()实现界面刷新;而在线程中...

    Android-UI刷新

    Android提供了Invalidate方法实现界面刷新,但是Invalidate不能直接在线程中调用,因为他是违背了单...Android程序中可以使用的界面刷新方法有两种,分别是利用Handler和利用postInvalidate()来实现在线程中刷新界面。

    精通Android 3 (中文版)2/2

    10.1 理解Android安全性模型  10.1.1 安全性概念概述  10.1.2 为部署签名应用程序  10.2 执行运行时安全性检查  10.2.1 进程边界上的安全性  10.2.2 声明和使用权限  10.2.3 理解和使用自定义权限  ...

    Android知识点及重要代码合集 word文档

    7.2 UI线程模型的两条规则及矛盾解决的三种方法 61 7.3 方法一代码 62 7.4 AsyncTask 特点、参数及需要实现的方法 64 7.5 异步任务代码 64 7.6 下载进度对话框相关实现代码 67 7.7使用runONUiThread()\...

    工程硕士学位论文 基于Android+HTML5的移动Web项目高效开发探究

    Android 一种基于Linux的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由Google公司和开放手机联盟领导开发 IOS 由苹果公司开发的移动操作系统 Webkit 一个开源的浏览器引擎,在手机上的...

    基于Android studio的记账app,兼顾基于Socket的IM即时通信聊天室,可直接使用

    通过将接收的信息进行相关处理与拟合,分为云端和本地两种处理方式。针对本地存储,主要为应对网络不佳或者无网络连接时进行手机本地的账单记录处理;而相对于本地处理,云端则是为了进行正常的数据存储,同时作为...

    android 面试2

    2. 如果后台的Activity由于某原因被系统回收了,如何在被系统回收之前保存当前状态?...一个component的intent filter告诉android该component能处理的intent。intent filter也是在manifest文件中声明的

Global site tag (gtag.js) - Google Analytics