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();
}
}
<完>