前言:关于Java中的回调一直是困扰着我的一个问题,虽然感觉好像没什么好说的,但是作为强迫症患者,就会深究其中无法自拔。例如:为什么要回调?回调和委派是什么关系?感觉要实现委派,回调似乎是少不了的。那么Android中的事件处理委派机制和回调机制的区别究竟是什么?接下来就来研究一下Java中的回调吧。
一、什么是回调?
二、为什么要引入回调?
三、接口回调的实例和原理。
package test;
public class Service {
private Callback mCallback;
/**
* 在服务端定义一个回调接口
*/
public interface Callback {
void callbackFunction();
}
/**
* 客户端初始化时需要传入一个Callback接口的实现类。
*
* @param mCallback
* 相当于客户端抛给服务端的“钩子”,服务端将通过这个“钩子”实现回调。
*/
public Service(Callback mCallback) {
this.mCallback = mCallback;
}
/**
* 服务端提供给客户端的服务
*/
public void startThinking() {
for (int i = 0; i < 5; i++) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("I'm thinking!!!:" + i);
}
System.out.println("Service done!");
// 回调客户端的回调函数,mCallback是客户端传过来的“钩子”
mCallback.callbackFunction();
}
}
接着是客户端的代码:
package test;
import test.Service.Callback;
public class Client {
public static void main(String args[]) {
Callback mCallback = new Callback() {
@Override
public void callbackFunction() {
System.out.println("Back to client!");
}
};
//这里相当于将接口的实现类传给了服务端,提供了服务端回调的一个“钩子”
Service mCallee = new Service(mCallback);
//请求服务端的服务,相当于例子中小明打电话问小王的过程,接下来就只要等小王打回来就行了(回调)
mCallee.startThinking();
}
}
执行结果:
小结:从上面可以看出,这种回调是基于接口的一种回调,客户端将接口的实现类(“钩子”)丢给服务端,服务端做完事情之后这个“钩子”使回调成为可能,通过“钩子”回调了客户端代码。
大致原理如图: