一般我们在java中常说起的回调大多是指方法的回调,方法回调以我的理解就是,一个类在调用另一个类的方法是,这个类的方法也会被另一个类调用的情形。
那么先了解一个java回调机制的概念:
软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用、回调和异步调用。
同步调用:一种阻塞式调用,调用方要等待对方执行完毕才返回,它是一种单向调用;
回 调:一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口;
异步调用:一种类似消息或事件的机制,不过它的调用方向刚好相反,接口的服务在收到某种讯息或发生某种事件时,会主动通知客户方(即调用客户方的接口)。
回调和异步调用的关系非常紧密:使用回调来实现异步消息的注册,通过异步调用来实现消息的通知。
了解概念后,我们来运用实例来更加深入的了解java回调机制。
这种实例网上很多,下面就写一个java回调的简单实例。
比如有这样一种情景:一个学生在学习中遇到一个问题,他自己搞不定,怎么办呢,这时候他决定向教授请教,所以他爸把问题反馈给教授了,这时候教授不可能马上就能把问题给解决了啊,他就告诉学生你先回去,等我解决了回头我告诉你啊。就这样学生回去了,等老师的答案。从问题中我们可以看出,根据现实具体情况,学生不是一直等着教授
把问题做完,而是回去干别的事等消息了,这是个异步的情景。首先思路:他给老师提出了一个问题,老师解决这个问题可能需要花一段时间,所以学生拜访后就回去做自己的
事情去了,在家等老师的消息。对就是这样。
首先定义一个回调方法的接口:CallBack,里面定义了一个用于返回教授解决问题的答案。
然后定义一个被调用者,即解决问题的Teacher类,提供解决学生提出的疑问。
其次需要定义一个学生类,来向教授提出解决问题。提出解决问题等待,接收反馈问题的答案。这时候需要实现CallBack的方法,这是重点啊,细品请看代码吧!
1.回调方法
package com.util.callback;
/**
* 回调接口,提供反馈答案方法
* @author test
*
*/
public interface CallBack
{
public void toAnswer(String result);
}
2.被调用者,老师回调了学生的回调方法
package com.util.callback;
/**
*
* 用于解决问题,并反馈答案
* @author test
*
*/
public class Teacher
{
public void executeMessage(CallBack callback,String question)
{
System.out.println("解决学生的:"+question+"中...");
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
String result="答案是10000";
System.out.println(result);
callback.toAnswer(result);
}
}
3.调用者,学生调用老师的实例方法
package com.util.callback;
public class Student implements CallBack
{
private Teacher teacher;
public Student(Teacher tea)
{
this.teacher=tea;
}
//学生提出问题:100*100=?
public void askQuestion(final String question)
{
System.out.println("这个题目做不到:"+question+",向老师寻求问题答案");
new Thread(new Runnable(){
public void run()
{
teacher.executeMessage(Student.this, question);
}
}).start();
System.out.println("老师我要出去吃饭了,挂了啊,等你答案");
playOther();
}
//打完电话吃饭去了
public void playOther()
{
System.out.println("出去吃饭...");
}
//回调方法,等待老师的答案
public void toAnswer(String result) {
System.out.println("老师的答案:"+result);
}
}
4.test mian()
package com.util.callback;
public class Test
{
public static void main(String [] args)
{
Teacher teacher=new Teacher();
Student student=new Student(teacher);
student.askQuestion("100 * 100 = ?");
}
}
通过上面的实例大家差不多应该大致了解了java回调的机制了吧。上面代码我觉得重点是student类实现了回调接口,student类里调用老师的方法的同事,由于传入的传入是Callback接口,这是student又实现了这个接口。所以根据java父类的引用指向子类的实例。就可以很方便的调用回调方法。就这样实现方法的回调。
其实在很多框架中都使用了回调的机制,比如android,和spring。要深入的了解和应用还是看看这些优秀的应用吧,绝对有惊喜。我这些例子也是从网上学习,望拍砖。