弄明白Android 接口回调机制

以前对于这个机制理解不够深刻,现在重新整理下思路。

一、建模

我理解的接口回调就是,我这个类实现了一个接口里的方法doSomething,然后注册到你这里,然后我就去做别的事情去了,你在某个触发的时机回头来调用我doSomething的方法。好比,我给你打电话问某个难题,你电话里想不出来,于是说等想到了再回我电话。于是接口回调机制比喻模型如下

\

第一步:<喎�"http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+ytfPyKOsxOPO0rXD1Ly2qKOs1eK49sq1z9a1xLe9t6jKx9Wm0fm1xKOsvdDKssO0w/vX1qOs0OjSqrSryOu0q7P2yrLDtKGjzqrKssO00qrV4tH5xNijv8TjztK1w9S8tqi157uwwarPtaOssrvKx86i0MW/27/boaPV4r7NysfUvLaotcS907/aoaM8L3A+CjxwPs7Sw8fUvLaotbHE48/rtb3OyszitcS08LC4vs272M7So6zL+dLU1eLA77SryOuyzsr9ysfE48/rtb21xLTwsLihozwvcD4KPHA+IDwvcD4KPHByZSBjbGFzcz0="brush:java;">public interface ContactInterface { public void callBackByTel(String answer); }

第二步:

我得先打电话(注册)到你那,告诉你我的问题是什么。是吧。

所以你那里必须有个方法让我告诉你问题相关事宜(注册)。


?
1
2
3
4
5
public void setCallBack(String who,String question,ContactInterface callBack) {
this .who = who;       
System.out.println( "你说:当前联系到我的人是" +who+ ",问题是" +question);
        this .callBack =callBack;
    }

第三步:

当你想到问题的答案后,打电话告诉我答案,即回调我传进来的方法。


?
1
2
3
4
5
6
7
8
9
10
11
12
13
public void handleThings(){
  //假如你现在正在想问题的答案,需要一点时间
  for ( int i= 0 ;i< 100000 ;i++){
               if (i == 0 ){
                       System.out.println( "你正在思考问题....." );
               }
         }
  
  String answer = "答案是A" ;
  //想到问题的办法了
  System.out.println( "你说:想到答案了,准备打回去给" +who+ "告诉他答案" );
  callBack.callBackByTel(answer);
  }


OK, 整个机制构成三要素就是:我(客户端),你(服务端),约定(接口)

我类——

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class Me {
 
      public static void main(String[] args){ 
          
          Me me = new Me();
          me.hasQuestion();
          
      }
      
      private void hasQuestion(){
          //现在有问题想不出来答案,想去问你
          You you = new You();
          you.setCallBack( "蜗牛" , "某道题答案是什么?" , new ContactInterface() {
             
             @Override
             public void callBackByTel(String answer) {
                 System.out.println( "我说:嗯,好的,我收到答案了:" +answer+ ",谢谢" );
                 
             }
         });
          //你接到电话,起床开始思考问题
         new Thread(you).start();
      }
}

你类——

?
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
package lin.callback.test;
 
public class You implements Runnable{
 
     
     private String who;
      private ContactInterface callBack; 
      public You() {
             // TODO Auto-generated constructor stub
         }
      
     //调用此方法就表示有人联系你了,注册到你这来
      public void setCallBack(String who,String question,ContactInterface callBack) {
          this .who = who;   
          System.out.println( "你说:当前联系到我的人是" +who+ ",问题是" +question);
             this .callBack =callBack;
         }
        
      public void handleThings(){
          //假如你现在正在想问题的答案,需要一点时间
          for ( int i= 0 ;i< 100000 ;i++){ 
                   if (i == 0 ){
                       System.out.println( "你正在思考问题....." );
                   }
             }
          
          String answer = "答案是A" ;
          //想到问题的办法了
          System.out.println( "你说:想到答案了,准备打回去给" +who+ "告诉他答案" );
          callBack.callBackByTel(answer);
      }
 
     /* (non-Javadoc)
      * @see java.lang.Runnable#run()
      */
     @Override
     public void run() {
         try {
             Thread.sleep( 1000 );
             handleThings();
         } catch (Exception e) {
             e.printStackTrace();
         }
     }
      
      
}

接口类——

?
1
2
3
4
5
public interface ContactInterface {
     
     public void callBackByTel(String answer);
     
}


验证结果:

\


二、总结

Java 中没有函数指针这一说,因为java没有指针,但是并不代表着它不会使用这个功能。事实上,引用就是实现了指针的功能。

回调方法就是一个通过方法指针来调用的方法。如果我将这个方法的指针(地址,引用)通过形参传递到另一个类的某个方法里,那么当这个类调用该方法里面我所传入的指针时,就能调用我这边的方法。

整个过程就是我传入方法A的地址,你接收,并在某个时刻回调我这边的A方法。

由于java没办法操作指针,于是它用接口来实现。

JAVA方法回调是一种耦合设计思想。作为一种架构,必须有自己的运行环境,并且提供用户的实现接口。

主要步骤如下:

  • 定义接口 Callback ,包含回调方法 callback();
  • 服务端提供注册的方法,并设定在某个条件下会回调接口方法;
  • 客户端提供接口的实现方法,并注册到服务端,把方法地址传进去。

    这样,在需要的时候,可用Caller对象的mCallback接口成员调用callback()方法,完成回调了。

    三、Android中的回调机制

    在android 中回调机制被大量使用。

    比如,在Activity中定义了很多生命周期的不同状态要调用的方法,这些方法都是空实现,系统框架要调用,用户也要调用来实现。或者更直接的是按键点击的实现方法。


    ?
    1
    2
    3
    4
    5
    6
    7
    8
    loginButton.setOnClickListener( new OnClickListener() {
      
    @Override
    public void onClick(View v) {
    // TODO Auto-generated method stub
      
    }
    });

    明显,OnClickListener就是android 系统所约定好的接口,然后我们写的应用程序就是客户端,android 系统就是服务端。模型关系如下图所示:

    以上可以看出,接口(系统框架)是系统提供的,接口的实现是用户实现的,这样可以达到接口统一,实现不同的效果。

    系统在不同的状态“回调”我们的实现类,来达到接口和实现的分类。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值