- 对于基于回调的事件处理模型,事件源与事件监听器是统一的,或者说事件监听器完全消失了。当用户在GUI界面上激发某个事件时,组件自己特定的方法会处理该事件。
- 基于监听的事件处理是事件源将事件处理委托给事件监听器;当该事件源发生特定事件时,就通知所委托的事件监听器,由事件监听器来处理事件。
一、与界面编程紧密相关的知识就是事件处理。当用户在程序界面上执行各种操作时,应用程序必须为用户动作提供响应动作,这种响应动作就是事件处理来完成的。
1、Android的事件处理分为两种,一种是基于监听的事件处理,一种是基于回调的事件处理,
1、 基于监听事件的模型
①Event Source 事件源:即事件发生的场所,例如,按钮,窗口,菜单。
②Event 事件:通常指一次用户的操作,例如用户单击,双击等。
③Event Listener 事件监听器:负责监听事件源所发生的事件,并对各种事件做出相应的响应。
简单理解基于监听的事件模型:当事件源发生事件时,系统将会执行该事件源上监听器的对应处理方法。
例子:
MyView view = (MyView) findViewById(R.id.Button);
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.i("miao","MyView : onClick");
}
});
Android基于监听事件处理实现有5种:
方法1,内部类作为事件监听类。
方法2,外部类作为事件监听器类。
方法3,Activity本身作为事件监听器。(上面例子Activity应该实现OnClickListener,
在类里面实现public void onClick(){}方法)
方法4,匿名内部类实现监听器。
方法5,直接绑定到标签。在layout中的组件,添加相应的方法名(如上onClick)
2、基于回调事件的处理
如果说事件监听是一种委托的事件处理,那么回调机制恰好相反,对于回调机制事件处理模型来说,事件源和时间监听器是统一的,或者说事件监听器完全消失了,当组件激发某个事件时,组件自己特定的方法会负责去处理,
而Java又是一个静态语言,我们无法为某个对象动态添加方法,因此只能继承GUI组件类,并重写该类的事件处理方法来实现。
①自定义UI界面来时现基于回调的时间处理机制。
public class MyButton extends Button {
public MyButton(Context context, AttribueSet set){
super(context,set);
}
public boolean onKeyDown(int keyCode,KeyEvent event){
super.onKeyDown(keyCode,event);
Log.v("sfs","sdf");
return true;
// 返回true表示该事件完全处理,不会传播出去,如果false,表示未完全处理
}
}
②在UI 界面添加自定义的Button
<com.sim.demo.MyButton
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="点击我"
/>
3、事件传播
某组件上发生的事件不仅会激发该组件上的回调方法,也会触发该组件所在的Activity的回调方法----只要事件能传播到该Activity。
public class Propagation extends Activity{
puglic void onCreate(Bundle savedInstanceState){
super.onCreate(saveInstanceState);
bt = findViewById(R.id.bn);
bt.setOnKeyListener(new OnKeyListener(){
public boolean onKey(View source,int keyCode,KeyEvent event){
if(event.getAction()==KeyEvent.ACTION_DOWN){
Toast.makeText(getApplicationContext(), "触发了点击效果",Toast.LENGTH_SHORT)
.show();
}
return false; //会向外扩散
}
});
public boolean onKeyDown(int keyCode,KeyEvent event){
Toast.makeText(getApplicationContext(), "触发了点击效果",Toast.LENGTH_SHORT)
.show();
return true;
}
}
上面就会触发两次效果。
4、对比Android两种事件处理方式
不难发现基于监听事件处理模型具有更大的优势,基于监听的事件模型分工更明确,事件源,事件监听由两个类分工实现,因此具有更好的课维护性。所以通常优先考虑基于监听的事件处理。