Android事件处理机制
1、1.监听事件处理
基于监听的事件处理分工明确,可维护性高,且会优先触发。
内部类形式:Class MyClickListener implements View.OnClickListener{ 实现的方法,即事件处理器}
外部类形式:将事件监听器类定义成一个外部类:public class SendSmsListener implements OnLongClickListener{容易把业务逻辑和显示逻辑耦合,不利于程序的内聚性:p195}
Activity本身作为事件监听器:让Activity本身实现监听器接口,并实现处理方法。做法简洁,Activity本身应该完成界面的初始化工作,同时包含事件处理比较混乱。public
匿名内部类形式:btn.setOnClickListener( new OnClickListener(){ 实现时间的处理方法 });
绑定到标签:在XML未指定标签绑定事件处理方法,android:onClick = "clickHandler",写一个clickHandler(){ 处理 }方法。
2、2.回调事件处理
监听事件处理是委托式处理,回调事件处理是实现组件自己特定的方法来处理事件,没有监听事件。
public MyButton extends Button{
public boolean onKeyDown(int KeyCode,KeyEvent event){
super.onKeyDown(KeyCode,event);
Log.v("返回值","true不会向外扩散");
return true;
}
}
MyButton重写了父类的onKeyDown()方法,不需要绑定监听,自己会处理相应的事件。
回调方法的返回值为true表示能完全处理,不会传播出去。返回false,表示未完全处理,会传播出去。 如果没有完成处理(false),则由监听器-->事件回调-->传播到activity,都会出发该方法处理。
3、3.相应系统设置的事件
Configuration类专门用于描述手机上配置信息,包括用户特定配置和系统动态配置。
Configuration cfg = getResources().getConfiguration();获取了Configuration对象可以使用该对象提供的属性来获取系统配置。
4、4.Handler消息传递机制
主线程又称为UI线程,在主线程不进行耗时操作,这是需要用到handler。耗时操作会引发ANR异常。
Handler类主要有两个作用:在新启动的线程中发送消息至MessageQueue ;在主线程中获取Looper分给他的消息,处理消息。
Looper :每个线程只能拥有一个looper ,负责管理MessageQueue,不断从消息队列中取出消息,分给对应的Handler处理。
MessageQueue :消息队列,采取先进先出的方式管理message。
HandlerMessage() :Handler接收和处理的消息对象。
在主线程中,系统已经初始化了一个Looper对象,因此程序直接创建Handler并收发消息即可;而自己启动的子线程,必须自己创建一个Looper对象并启动它:Looper.prepare() 创建对象并保证只有一个Looper对象。
Android不允许在子线程中更改UI组件,需要在子线程中更改界面组件必须用handler实现。
5、5.异步任务
实现异步任务的机制有两种:Handler和AsyncTask。
AsyncTask<Params,Progress,Result>
三种泛型类型分别代表“启动任务执行的输入参数”、“后台任务执行的进度”、“后台计算结果的类型”。在特定场合下,并不是所有类型都被使用,如果没有被使用,可以用java.lang.Void类型代替。
一个异步任务的执行一般包括以下几个步骤:
1.execute(Params... params),执行一个异步任务,需要我们在代码中调用此方法,触发异步任务的执行。
2.onPreExecute(),在execute(Params... params)被调用后立即执行,一般用来在执行后台任务前对UI做一些标记。
3.doInBackground(Params... params),在onPreExecute()完成后立即执行,用于执行较为费时的操作,此方法将接收输入参数和返回计算结果。在执行过程中可以调用publishProgress(Progress... values)来更新进度信息。
4.onProgressUpdate(Progress... values),在调用publishProgress(Progress... values)时,此方法被执行,直接将进度信息更新到UI组件上。
5.onPostExecute(Result result),当后台操作结束时,此方法将会被调用,计算结果将做为参数传递到此方法中,直接将结果显示到UI组件上。
在使用的时候,有几点需要格外注意:
1.异步任务的实例必须在UI线程中创建。
2.execute(Params... params)方法必须在UI线程中调用。
3.不要手动调用onPreExecute(),doInBackground(Params... params),onProgressUpdate(Progress... values),onPostExecute(Result result)这几个方法。
4.不能在doInBackground(Params... params)中更改UI组件的信息。
5.一个任务实例只能执行一次,如果执行第二次将会抛出异常。