码迷,mamicode.com
首页 > 移动开发 > 详细

疯狂Android讲义第三章-Android的事件处理

时间:2015-01-17 08:51:22      阅读:219      评论:0      收藏:0      [点我收藏+]

标签:activity   消息响应   监听   回调   android事件处理   

本章主要涉及内容有:

一、Android事件处理机制,其中包括监听和回调两种处理机制

二、Configuration类

三、Handler、Loop及MessageQueue

四、AsyncTask


一、监听机制和回调机制

1.1-监听机制

监听事件处理模型包括三类对象:事件源、事件和事件监听器。其中事件源为事件发生的场所/组件,事件为用户动作,事件监听器则负责监听并处理事件。

以用户点击某Button后,在主界面中显示Toast这一过程为例,其中:

事件源为Button

事件为用户点击该Button

事件监听器(此处为onClickListener)负责监听并处理该事件(显示Toast)

典型的代码实现:

btn.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				Toast.makeText(getApplication(), "Btn Clicked", Toast.LENGTH_SHORT)
						.show();
			}
		});
监听器的实现形式主要有四种:内部类形式、外部类形式、Activity本身作为事件监听器类、匿名内部类形式

代码中实现方式为匿名内部类形式,这也是最常用的形式。


1.2-回调机制

回调与监听机制的不同之处主要在于:监听机制中,由事件监听器负责监听及处理发生的事件。而在回调机制中,事件源中已经写好了事件发生时应如何处理,即处理事件这一动作由事件源本身完成,而不是托付给事件监听器。重载回调函数后将该View置于Activity的layout布局文件中即可。

注意,此处回调函数的返回值为boolean型。若返回true,表示事件处理完成后不会向上传递。返回false,则表示会继续将该事件传递给更上一层进行处理。

同样以点击Button为例,若Button中返回false,则在Button的回调函数中处理完该事件后,会继续调用放置Button的Activity中响应回调函数进行处理。

代码实现:

public class MyButton extends Button {

	public MyButton(Context context, AttributeSet attrs) {
		super(context, attrs);
		// TODO Auto-generated constructor stub
	}
	@Override
	public boolean onTouchEvent(MotionEvent e){
		Toast.makeText(getContext(), "Btn Clicked", Toast.LENGTH_SHORT).show();
		return true;
	}
}

若同时实现了监听和回调机制,则调用顺序为监听->回调。以此处为例,若同时实现了两者,则会先调用监听器中的onClickListener,再回调onTouchEvent。


二、Configuration类:用于获取设备状态的类,Android可调用Activity的如下方法获取系统的Configuration对象:

Configuration cfg = getResource().getConfiguration();

三、Handler、Loop及MessageQueue

Android中不允许子线程执行UI操作,只能通过利用Handler达到目的。

Handler的主要作用有两个:

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

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

Handler处理的消息来源于MessageQueue,而MessageQueue由Loop进行管理。

子线程需要执行UI操作的流程为:子线程将消息请求加入至MessageQueue的末尾->主线程从子线程的MessageQueue中获取到该消息后,回调子线程中的handleMessage函数,执行处理动作。

实现有UI操作需求子线程类,在public void run()中需编写以下几步:

1.调用Looper.prepare();创建该线程的MessageQueue

2.定义Handler,重载handleMessage函数。主线程从子线程的MessageQueue中取出消息后回调该函数执行UI操作

3.Looper.loop();启动Looper。

主UI线程中系统已初始化了一个Looper对象,因此不需要执行Looper.prepare,Looper.loop()


四、AsyncTask

疯狂Android讲义第三章-Android的事件处理

标签:activity   消息响应   监听   回调   android事件处理   

原文地址:http://blog.csdn.net/miaoyunzexiaobao/article/details/42786901

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!