1.概念:
从概念上讲,回调函数与普通函数的本质在于:调用者的不同。普通函数由程序员代码调用,而回调函数由操作系统在适当的时间调用。
回调函数主要用于处各种事件和处理。由于WINDOWS系统中存在大量程序员事先不可知的事件,例如鼠标的单击,程序员事先无法得知终端用户何时会发出此动作,因此只能:
A定义事件的处理逻辑,与普通函数的编程一样;
B告之操作系统自己的处理逻辑,即通知操作系统函数指针;VC/VB等现代编程语言通过事件编程机制隐藏了这一步;
C操作系统在事件出现时,调用指定的函数(回调函数的概念)处理,这一步完全由系统负责。
回调函数在各种操作系统中普遍存在,是现代操作系统为程序员提供处理异步事件的基本机制之一,在不同的系统中的具体实现方式各不相同;请参阅随机文档Callback 函数实质就是你实现这个函数,由操作系统调用。而一般的情况下是,操作系统提供函数由你来调用的。回调函数实际上就起到了消息循环的作用,因为在sdk中只有通过回调函数来发送各自的处理消息
2.定义:
回调函数就是一个通过函数指针调用的函数. 如果你把函数的指针(地址)作为参数传递给另一个函数, 当这个指针被用为调用它所指向的函数时,我们就说这是回调函数.回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外一方调用的,用于对该事件或条件进行响应.
回调函数实现的机制是 :
(1) 定义一个回调函数;
(2) 提供函数实现的一方在初始化的时候,将回调函数的函数指针注册给调用者;
(3) 当特定的事件或条件发生的时候,调用者使用函数指针调用回调函数对事件进行处理.
使用回调函数,可以把调用者与被调用者分开.调用者不关心谁是被调用者,所有它需知道的,只是存在一个具有某种特定原型、某些限制条件(如返回值为int)的被调用函数.
3.举例:
去宾馆后,向前台告知明天六点叫我起床,这句话说明了两个Function 1.请求叫醒服务 2.宾馆记录下来到具体时间点叫醒自己。 用代码实现这里的逻辑如下:
1.首先需要一个回调函数的接口,双方的一种约定。
2.Guest和Hotel的实体类,这里Guest需要Hotel的引用,因为服务是 Hotel提供的。其次开启一个单独的线程,来表示双方各自工作的关系。
同样Hotel只需要一个具体服务的引用(Callback接口)和具体内容(这里是时间)
@1接口:Callback
package com.callback.demo; public interface Callback { public void callback(String result); }
@2具体实现类Guest
1 package com.callback.demo; 2 3 public class Guest implements Callback { 4 Hotel hotel; 5 public Guest(Hotel hotel) { 6 this.hotel=hotel; 7 } 8 //客人的告诉宾馆叫醒服务(时间) 9 public void awake(String date ) { 10 System.out.println("走到前台。。。要求服务"); 11 //宾馆登记 12 new Thread(new Runnable() { 13 14 @Override 15 public void run() { 16 // TODO Auto-generated method stub 17 hotel.recordAndWake(Guest.this, date); 18 } 19 20 }) { 21 22 }.start(); 23 //等待服务办理 24 System.out.println("等待服务办理"); 25 try { 26 Thread.sleep(1000); 27 } catch (InterruptedException e) { 28 // TODO Auto-generated catch block 29 e.printStackTrace(); 30 } 31 doOtherThing(); 32 33 } 34 //长夜慢慢 无心睡眠 35 void doOtherThing() { 36 System.out.println("吃吃宵夜"); 37 System.out.println("睡觉了,等待叫醒"); 38 } 39 40 @Override 41 public void callback(String result) { 42 // TODO Auto-generated method stub 43 System.out.println("hotel=============叫醒服务"+result); 44 } 45 46 }
Hotel
1 package com.callback.demo; 2 3 public class Hotel { 4 //提供的服务 需要服务对象 以及服务内容 5 public void recordAndWake(Callback callback,String date) { 6 System.out.println("hotel记录时间为====="+date); 7 //模拟长夜慢慢 8 try { 9 Thread.sleep(5000); 10 } catch (InterruptedException e) { 11 // TODO Auto-generated catch block 12 e.printStackTrace(); 13 } 14 15 16 date="时间到了。。。。客人"; 17 callback.callback(date); 18 } 19 }
test
1 package com.callback.demo; 2 3 public class TestCase { 4 5 public static void main(String[] args) { 6 // TODO Auto-generated method stub 7 Hotel hotel = new Hotel(); 8 Guest guest = new Guest(hotel); 9 guest.awake("明天早上6.00"); 10 11 } 12 13 }