我理解的回调函数就是调用者并非函数的实现者。
应用场景:比如我一直在做的字幕模块,输入是视频流中的原始字幕数据,输出时直接调用输出模块的绘制接口,并将字幕坐标,字幕内容,字幕样式等信息传入。问题来了,我在实现模块的时候并不知道输出设备是啥,甚至是Linux还是android都不知道,肿么办?用回调函数啊。声明一个函数指针,实现一个注册函数用于初始化这个函数指针,我在字幕模块中就用这个指针指向的函数来绘制,而这个函数的实现我完全不在意,用户在实现业务时候自然会去实现绘制函数,并通过注册函数告诉我其实我调的绘制函数是哪一个。
以上是c的思路,java没有指针的概念,所以只能用接口来实现了。
c回调函数,利用函数指针实现
Caller.h
#ifndef CALLER_H_
#define CALLER_H_
typedef void (*HELLO_CB_FN)(void);
void registerCB(HELLO_CB_FN helloCB);
void hello();
#endif
Caller.c
#include "Caller.h"
HELLO_CB_FN hello_cb;
void registerCB(HELLO_CB_FN helloCB)
{
hello_cb = helloCB;
}
void hello()
{
hello_cb();
}
#include <stdio.h>
#include <stdlib.h>
#include "Caller.h"
void hello_()
{
printf("hello world!!!");
}
int main(void)
{
registerCB(hello_);
hello();
return EXIT_SUCCESS;
}
java回调函数,利用接口实现
CallbackInterface.java
package com.example.callback;
public interface CallbackInterface {
public void helloWorld();
}
Callee.java
package com.example.callback;
public class Callee implements CallbackInterface{
@Override
public void helloWorld() {
System.out.println("hello world!from callback fun~~");
}
}
Caller.java
package com.example.callback;
public class Caller {
private CallbackInterface mCallbackInterface;
public void registerCallback(CallbackInterface mCallbackInterface)
{
this.mCallbackInterface = mCallbackInterface;
}
public void helloWorld()
{
mCallbackInterface.helloWorld();
}
}
TestMain.java
package com.example.callback;
public class TestMain {
//回调函数:调用者非函数的实现者
public static void main(String[] args){
Caller mCaller = new Caller();
//先注册
mCaller.registerCallback(new Callee());
//再使用
mCaller.helloWorld();
}
}