写得Java多的同学一般随手写个interface来可以实现回调了。
public interface CallBack {
public void onAnwerListenner(String anwer);
}
public class Response {
CallBack callBack = null; // 全局变量
public void anwer(String question,CallBack callBack){
this.callBack=callBack;
new Thread(new Runnable() {
@Override
public void run() {
String anwer="the answer is *****";
if(callBack!=null) {
callBack.onAnwerListenner(anwer);// 进行回调
}
}
}).start();;
}
}
关于在C/C++中就不是使用interface了,也可以使用虚函数等形式实现回调,但是需要一个class的支持。
比起使用class再进行继承等工作写法更为简单的就是使用函数指针了。
#include <stdio.h>
int add(int a,int b){
return a+b;
}
void test(int(*p)(int,int),int a,int b){
printf("result = %d\n", (*p)(a,b));
}
int main(){
test(add, 1, 2);
return 0;
}
运行输出 result = 3
嗯,再加入一个函数指针变量并赋值使用;
#include <stdio.h>
int add(int a,int b){
return a+b;
}
void test(int(*p)(int,int),int a,int b){
printf("%d\n", (*p)(a,b));
}
int main(){
int (*myadd)(int a, int b);
myadd = &add;
test(myadd, 1, 2);
return 0;
}
C/C++拥有函数指针的语法,回调变得异常的简便了;
如果是使用Java的思路,就是建立class,再建立虚函数,进行继承初始化然后回调等系列工作;
如果是封装成SDK,这里参考PJSIP协议栈的库的用法,PJSIP协议栈的SDK使用了大量的回调函数。
向外提供一系列非常简便的回调接口,有:
注册状态回调,呼叫状态回调,对方状态回调(当前正在输入,当前正在振铃,对方执行接听动作,对方执行挂断动作等)。
#include <stdio.h>
typedef int pjsua_call_id;
typedef struct pjsua_callback{
void (*on_call_media_state)(pjsua_call_id call_id);
}pjsua_callback;
void _on_call_media_state(pjsua_call_id call_id){
printf("call_id=%d\n", call_id);
}
int main(){
struct pjsua_callback cfgcallback;
cfgcallback.on_call_media_state = &_on_call_media_state;
cfgcallback.on_call_media_state(100);
return 0;
}
运行输出 call_id=100
PJSIP定义了很多不同用途的结构体,定义了大量的函数指针用于保存对应的回调情况;
如果需要封装SDK,使用大量的函数指针可以更加简洁的对外提供接口;
使用结构体分类保存不同场景下的接口以及变量,利于代码扩展和阅读。
猜测Java里的回调函数实际上也只是函数指针的一种用法,先保存函数地址,然后调用该函数;
回调理应是一种利用函数指针进行函数调用的过程,Java或者其他语言也不例外;