这段时间学习java的回调机制,在网上包括博客寻找了许多关于回调的一些文章和文献,最终自己尝试着理解和写了一些回调的实现用作学习理解,话不多说,直接上主菜。(本人新人入坑,只是阐述了自己的理解与实现,欢迎大家交流批评~)
回调我这里说两种,一个是同步回调,一个是异步回调。(文章最后有图解,听说代码和图片在一起更配哦~)
同步回调(代码是写给有恒心之人)
这里我先把同步回调代码贴出来
情景;小明和小芳在聊天,小明问小芳在做什么,小芳马上回答了后,小明便说收到了
这里先定义了一个接口
public interface CallBackInterface {
public void execute();
}
然后实现小明的类,他实现了上面的接口。
public class XiaoMing implements CallBackInterface{
public XiaoMing(){
System.out.println("小芳在做啥?");
}
public void execute() {
System.out.println("收到了!!" );
}
}
然后定义小芳的类
public class XiaoFang {
private CallBackInterface callback;
public XiaoFang(){
}
public XiaoFang(CallBackInterface callback){
this.callback = callback;
}
public void doSome(){
System.out.println("我刚才去洗碗了!");
//I can call you back
callback.execute();
}
}
最后便是做场景的main方法啦
public class MainC {
public static void main(String[] args){
System.out.println("单线程同步回调");
XiaoMing xiaoming = new XiaoMing();
XiaoFang x2 = new XiaoFang(xiaoming);
x2.doSome();
}
}
运行结果;
单线程同步回调
小芳在做啥?
我刚才去洗碗了!
收到了!!
让我们来捋一捋思路,小明的实现的callback接口就像是一个可供回话的电话号码,小明在主方法中先实例化了自己(问小芳在做啥),并在其中留下了一个回话的方法(当然小明是不可能知道小芳会讲什么的 )。然后小芳实例化了自己,并把小明的问题和回话方法拿到并做出了回应(“我刚才去洗碗了”),然后打电话(callback.execute()),小明这时便收到了消息(我收到了)。这个例子中不难看到回调的身影,小明a->小芳b->小明a的回答。
再来看看异步回调。
情景;小明问小芳在做啥,然后小明便出门了,小明留下了一台可供收消息的留言机,小芳过了一会才收到消息并回复。
上代码
还是先定义一个callback接口
public interface CallBack {
public void result();
}
然后是小明的方法
public class XiaoMing implements CallBack{
public XiaoMing(){
System.out.println("小芳在做啥?");
}
public void result() {
System.out.println("小明回答;收到!");
}
}
小芳
public class XiaoFang implements Runnable{
public CallBack callback;
public XiaoFang (CallBack callback){
this.callback = callback;
}
public void run() {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("过了两秒小芳才回答");
System.out.println("我去喝奶茶了");
callback.result();
}
}
然后便是主场景MainA
public class MainA {
public static void main(String[] args){
XiaoMing x = new XiaoMing();
XiaoFang xiaofang = new XiaoFang(x);
new Thread(xiaofang).start();
System.out.println("小明问完就出门买东西了");
}
}
运行结果;
小芳在做啥?
小明问完就出门买东西了
过了两秒小芳才回答
我去喝奶茶了
小明回答;收到!
可以看到,异步回调与同步回调并没有太大的区别,唯一的区别便是小芳这次没有马上回答,而是等了一会才回了消息(新开线程),但是回调的实现还是基本一模一样的,还是小明a->小芳b(等待后)->小明a的回答。
当然了,多线程回调的实际开发我觉得可能更多用在网络请求中。
最后,不多解释,上图!
没错这就是回调的流程图解,
1,首先两个对象都实现了callback接口,对象A(小明)在他其中实现了callback具体要做的事 ;
2,然后对象B(小芳),会取得对象A(小明的)传入的callback,也就是this.callback = callback ;
3,这时,对象B(小芳)执行的便是对象A(小明)实现的接口callback的方法啦(“收到了”)!
是不是很眼熟,对了你想的没错,就是android的点击事件,我们平时写的匿名onclicklistener就是我们的小明,而小芳就是我们用的控件(你可以在button源码里发现this.onclicklisten = onclicklisten ~ . ~)。具体的实际运用大家就自己去研究拉~(如果你觉得这篇文章值得一读,那希望读者大人们能为作者点个赞哦~)