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

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
    //这里要做处理的事,需要B对象的exeute()方法执行完毕才能继续执行,例如,这里依赖B.exeute()处理后的数据.
    }
}

class B{
    private A a;
    public B(A a){
    this.a=a;
    }
    public Integer execute(){
    // 在这里执行耗时操作
    ...
    ...
    ...
    //然后调用A类中的afterGetDataFromB()方法,即可实现回调
    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();
    }
}

<完>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值