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
    }
}

class B{
    private A a;
    public B(A a){
    this.a=a;
    }
    public Integer execute(){
    // time consuming task Code 
    a.afterGetDataFromB();
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

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


不过,这样有一个问题,就是,代码之间的耦合性较高,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();
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

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


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

版本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;
    }

posted on 2017-09-03 23:21  信假名如  阅读(571)  评论(0)    收藏  举报

导航