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

一、建模

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

 

Android 回调方法与线程 android回调接口_Android 回调方法与线程

 

第一步:

首先,你我得约定,这个实现的方法是咋样的,叫什么名字,需要传入传出什么。为什么要这样呢?你我得约定电话联系,不是微信扣扣。这就是约定的接口。

我们约定当你想到问题的答案就回我,所以这里传入参数是你想到的答案。

 


[java]  view plain  copy


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



     

    第二步:

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

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


    [java]  view plain  copy


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



       

      第三步:

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


      [java]  view plain  copy

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




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

       我类——


      [java]  view plain  copy

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


      你类——


      [java]  view plain  copy

      1. package lin.callback.test;  
      2.   
      3. public class You implements Runnable{  
      4.   
      5.       
      6. private String who;  
      7. private ContactInterface callBack;    
      8. public You() {  
      9. // TODO Auto-generated constructor stub  
      10.         }  
      11.        
      12. //调用此方法就表示有人联系你了,注册到你这来  
      13. public void setCallBack(String who,String question,ContactInterface callBack) {  
      14. this.who = who;      
      15. "你说:当前联系到我的人是"+who+",问题是"+question);  
      16. this.callBack =callBack;  
      17.         }  
      18.          
      19. public void handleThings(){  
      20. //假如你现在正在想问题的答案,需要一点时间  
      21. for(int i=0;i<100000;i++){    
      22. if(i == 0){  
      23. "你正在思考问题.....");  
      24.                   }  
      25.             }  
      26.            
      27. "答案是A";  
      28. //想到问题的办法了  
      29. "你说:想到答案了,准备打回去给"+who+"告诉他答案");  
      30.          callBack.callBackByTel(answer);  
      31.      }  
      32.   
      33. /* (non-Javadoc)
      34.      * @see java.lang.Runnable#run()
      35.      */  
      36. @Override  
      37. public void run() {  
      38. try {  
      39. 1000);  
      40.             handleThings();  
      41. catch (Exception e) {  
      42.             e.printStackTrace();  
      43.         }  
      44.     }  
      45.        
      46.        
      47. }


      接口类——


      [java]  view plain  copy

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


      验证结果:

      Android 回调方法与线程 android回调接口_服务端_02


      二、总结

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

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

       

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

       

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

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

      主要步骤如下:

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

       

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

       

      三、Android中的回调机制

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

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


      [java]  view plain  copy


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




       

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

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

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

       

      Android 回调方法与线程 android回调接口_System_03