android中的事件处理(回调,监听)

来源:互联网 发布:java的环境变量配置 编辑:程序博客网 时间:2024/06/07 04:56

android中的事件处理机制有两种:
基于回调的事件处理机制基于监听的事件处理机制

基于回调的事件处理大多是在涉及到多线程时使用:

在类A中调用了一个耗时类B进行数据处理。但是,因为A无法得知B需要用多长时间才能将处理完数据,因而无法正确的接收B中返回的数据做后续处理。这时,回调的使用便可解决这一问题,对回调通俗的解释就是,在B中耗时操作结束后直接在B中调用A中的方法进行后续处理,而避免A中做迷茫的等待,或还没有得到数据就进行读取。

具体实现方法就是:在实例化B时,将A的实例传入B。然后在B中,当耗时操作结束后再利用A的实例调用A中的方法,即可:

版本1:

class A{    new B(A.this).exeute();    public void afterGetDataFromB(){    //Code do Something    }}class B{    private A a;    public B(A a){    this.a=a;    }    public Integer execute(){    // time consuming task Code     a.afterGetDataFromB();    }}

这样便可实现基于回调的事件处理。


不过,这样有一个问题,就是,代码之间的耦合性较高,class B只能为A提供服务。倘若有其他类也需要class B 的话就会出现必须修改B的代码(使用重载的构造方法接收不同的服务对象,还要添加其他一些琐碎的代码才能实现),显然这种方式不够好,当有更多的类需要B提供服务时,就要不断的修改B中的代码。因此,为了更好的使用回调,避免以上情况,就是使用接口:
版本2:
在B中定义一个接口CallBack(),然后在任何需要使用B的类中实现这个接口,并在实例化B时,将自身实例传入即可:

class A implement CallBack{    new B(A.this).exeute();    @Override    public void afterGetDataFromB(){    //Code do Something }}class B{    private CallBack callBack;    public B(CallBack callBack){    this.callBack=callBack;    }    public Integer execute(){    // time consuming task Code     callBack.afterGetDataFromB();    }/***定义一个接口*/    interface CallBack(){    public void afterGetDataFromB();    }}

图示:
利用接口回调用法示意图


但在实际使用中,使用接口时往往还有一种更简洁的方式,不用显示的使用接口。在使用时,不传入自身实例,而是直接实例化一个接口对象,以匿名内部类的形式使用接口,并在这个对象中实现接口中定义的方法:

版本3:

class A {    new B(new CallBack(){        @Override        public void afterGetDataFromB(){        //Code do Something        }    }).exeute();}class B{    private CallBack callBack;    public B(CallBack callBack){    this.callBack=callBack;    }    public Integer execute(){    // time consuming task Code     callBack.afterGetDataFromB();    }/***定义一个接口*/    interface CallBack(){    public void afterGetDataFromB();    }}

<完>

0 0