java回调函数

来源:互联网 发布:宜信数据挖掘工程师 编辑:程序博客网 时间:2024/05/20 20:17

       在C或者C++中回调函数的定义:程序A在调用一个函数B时,将自己的函数的地址作为参数传递给程序调用的函数B时(那么这个自己的函数A称回调函数)。图示如下:


        Java中没有指针,不能传递方法函数的地址,一般采用接口回调实现。原理简介如下:首先创建一个回调对象,然后再创建一个控制器对象,将回调对象需要被调用的方法告诉控制器对象。控制器对象负责检查某个场景是否出现或某个条件是否满足。当此场景出现或此条件满足时,自动调用回调对象的已告知方法。
(1)可以举个现实生活中的例子:一读者想借《软件技术学习与实践》这本书,但这本书已被其他读者借走了。于是,读者与图书馆管理员间发生了以下对话:

读者:“我把我的电话号码告诉你,等书一到就马上通知我。”
管理员:“好的。另一读者把书还回来后,马上给您打电话,书我先帮您留着。”
在上述这个场景中,读者就是“回调对象”,管理员就是“控制器对象”,读者的电话号码就是“回调对象的方法”。

(2)代码示例。

A,创建一个回调接口ICallBack.java

[java] view plaincopy
  1. public interface ICallBack {  
  2.     void run();  
  3. }  

B,另一个TestNew.java中完成以下几步:

创建回调接口的实现类:

[java] view plaincopy
  1. class CallBackClass implements ICallBack{  
  2.     public void run(){  
  3.         System.out.println(System.currentTimeMillis());  
  4.     }  
  5.  }     //完成接口中的抽象函数,打印当前系统时间(毫秒)     

创建控制类:

[java] view plaincopy
  1. class Controller{  
  2.     public ICallBack CallBackObject = null;     // 定义回调对象成员  
  3.     Scanner input = new Scanner(System.in);     //从键盘读取输入  
  4.     public Controller(ICallBack obj){  
  5.         this.CallBackObject = obj;                          //给回调对象赋值  
  6.     }  
  7.     public void Begin(){  
  8.         while(input.next()!=null){  
  9.             CallBackObject.run();               //当键盘有输入,执行回调对象的函数  
  10.         }  
  11.     }  
  12. }  

主程序:

[java] view plaincopy
  1. public class TestNew {  
  2.     public static void main(String[] args) {  
  3.         // TODO Auto-generated method stub  
  4.         Controller obj = new Controller(new CallBackClass());       //将回调对象示例传入控制器对象  
  5.         obj.Begin();  
  6.     }  
  7. }  

编译完成后,在console中输入字符时,就会回显诸如“1359989219187”的系统时间。

(3)综上,当一个interface作为一个函数A或类B构造函数的形参要new时,就构成回调了。就函数A这种情况举例,比如:

在camera.java中定义的有

[java] view plaincopy
  1. public class Camera {  
  2.     private FaceDetectionListener mFaceListener;  
  3.     .....  
  4.     public interface FaceDetectionListener  
  5.          {  
  6.           void onFaceDetection(Face[] faces, Camera camera);  
  7.          }  
  8.          public final void setFaceDetectionListener(FaceDetectionListener listener)  
  9.          {  
  10.                mFaceListener = listener;  
  11.          }  
  12.          .....  
  13. }  

     则在实际使用中:

[java] view plaincopy
  1. protected Camera mCameraDevice = null;  
  2. ..........  
  3. mCameraDevice = CameraServiceUtil.openCamera(mContext,mCameraId);  
  4. mCameraDevice.setFaceDetectionListener(new FaceDetectionListener() {  
  5.     public void onFaceDetection(Face[] faces, Camera camera) {     //必须实现  
  6.     }  
  7.         }  


 

参考原文:http://www.cnblogs.com/leon19870907/articles/2024077.html

原创粉丝点击