本章主要涉及内容有:
一、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
略