Android基于监听和基于回调的事件处理

  • 对于基于回调的事件处理模型,事件源与事件监听器是统一的,或者说事件监听器完全消失了。当用户在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两种事件处理方式

不难发现基于监听事件处理模型具有更大的优势,基于监听的事件模型分工更明确,事件源,事件监听由两个类分工实现,因此具有更好的课维护性。所以通常优先考虑基于监听的事件处理

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值