回调介绍
所谓回调,就是客户程序Client调用服务程序Service中的某个方法A,然后Service又在某个时候反过来调用Client中的某个方法B,对于Client来说,这个B便叫做回调函数。
回调的如何实现的呢
java的回调是通过接口或者内部类来实现的。
JAVA方法回调是功能定义和功能实现分享的一种手段,是一种耦合设计思想。作为一种架构,必须有自己的运行环境,并且提供用户的实现接口。
代码案例
这里就上面的讲解写一个最简单的例子:
第一步:因为方法的回调是通过接口来实现的所以要定义一个接口(我们称它为回调接口)
/**
* 定义一个回调接口,包含一个回调函数
* @author Administrator
*/
public interface CallBack {
/**
* 这就是Service回调Client的方法
* @param result 回调时携带的参数(可选)
*/
public void B(String result);
}
/**
* 这个Client类, 实现CallBack接口(条件一)
* @author Administrator
*
*/
public class Client implements CallBack{
/**
* Client类 包含 Service类 的引用 (条件二) 因为Client要调用Service中的方法
*/
Service service = new Service();//可直接实例化或在构造函数或某个方法中进行实例化
/**
* 该方法用于请求Service调用Service中的方法
*/
public void requrst(){
System.out.println("请求服务器调用服务器的方法");
service.A(this);//传入当前对象也就是CallBack对象,因为Client实现类CallBack接口
}
/**
* Service回调Client的实现方法
*/
@Override
public void B(String result) {
// TODO Auto-generated method stub
System.out.println("服务器回调我的方法返回的结果是:"+result);
}
}
public class Service {
CallBack callback;//定义接口类型对象,要调用接口中的回调方法
String result = "谢谢你的请求";
public void sendManage(Client client) {
this.callback = client;
callback.B(result);//调用的是该接口的实现方法(即Client中的B)
}
}
测试类
public class Test {
public static void main(String[] args) {
Client client = new Client();
client.requrst();
}
}
输出结果:
请求服务器调用服务器的方法
服务器回调我的方法返回的结果是:谢谢你的请求
回调实现的步骤
以上就是一个简单实现接口回调的机制,我们总结一下实现的所需的步骤:
1、定义回调接口和回调方法
2、Client实现回调接口和回调方法,并在Client中包含Service引用,通过引用调用Servie中的方法并且必须传入一个当前对象Client(因为当前对象实现了CallBack接口所以也属于接口对象)
3、在Service中定义一个接口对象并在方法中对初始化(将Client传过来的当前对象赋值给接口对象),通过接口对象调用接口中方法(调用的Client实现的接口方法)
4、测试
回调的综合案例(异步+回调)
以下一个比较综合的例子使用到了“异步+回调”
比如生活中的实例,某天,我打电话向你请教问题,当然是个难题,^_^,你一时想不出解决方法,我又不能拿着电话在那里傻等,于是我们约定:等你想出办法后打手机通知我,这样,我就挂掉电话办其它事情去了。过了XX分钟,我的手机响了,你兴高采烈的说问题已经搞定,应该如此这般处理。
故事到此结束。这个例子说明了“异步+回调”的编程模式。其中,你后来打手机告诉我结果便是一个“回调”过程,结果(即处理方法)就是一个回调函数。
我的手机号码必须在以前告诉你,即告诉你通过何种方式可以找到我,这便是注册回调函数;我的手机号码应该有效并且手机能够接收到你的呼叫,这是回调函数必须符合接口规范。
案例实现接口回调的步骤:
1.定义一个回调接口包含回调方法(这是接口约定,有答案时电话联系)
2.我(Me.java)这个类实现回调接口和提供回调方法的实现,并向你注册回调(因为只有向你注册了回调你才能回调我的方法告诉我答案)
3.你(You.java)这个类提供了接收问题并回答(回答就是我向你注册的回调参数类型为接口对象)的方法
4.测试类
/**
* 定义一个回调接口,包含一个回调函数
* @author Administrator
*/
public interface CallBack {
/**
* 当你知道答案可以调用该回调函数告诉我答案
* @param result 答案
*/
public void solve(String result);
}
/**
* 这个类代表我,因为你要告诉我答案所以要实现CallBack回调接口和接口中的回调方法的实现
* 我要向你提问所以有一个提问的方法askQqstion(),在提问的同时要向对方(你)注册回调接口,当你知道答案的时候调用我里面的接口实现方法,最后得到答案
* @author Administrator
*
*/
public class Me implements CallBack{
/**
* 我(Me)这里包含一个对你(You)的引用
* 因为我(Me)要调用你(You)里面的方法向你询问(问题的描述)和注册回调(用于你告诉我答案)
*/
private You you;
public Me(You you){
this.you = you; //实例化引用
}
/**
* 我通过这个方法向你进行提问,在提问时进行回调注册,让你在知道答案是可以告诉我
* @param question 问题的描述
*/
public void askQqstion(final String question){
//异步
new Thread(new Runnable() {
@Override
public void run() {
/**
* 我调用你的方法,在这里向你注册回调接口
*/
you.executeMessage(Me.this, question);
}
}).start();
}
// 我问完问题后就挂掉电话,让你去思考问题的答案同时我也可以去做别的事
public void play(){
System.out.println("我去完了");
}
/**
*当你知道答案后调用此方法告诉我,就是所谓的回调方法
*/
@Override
public void solve(String result) {
System.out.println("你告诉我的答案是--->"+result);
}
}
public class You {
/**
* 接收我的问题和基友回答问题的
* @param callBack 接口回调对象,通过该对象可以调用实现了该接口的对象(Me)中的接口实现方法(Me中的solve()方法)
* @param question 问题描述
*/
public void executeMessage(CallBack callBack, String question){
//模拟你要思考很长时间
for(int i=0;i<10000;i++){
}
/**
* 想到了答案
*/
String result = "答案就是我也不知道";
/**
* 想到后你就打电话告诉我,放过来调用我这个类中的回调方法
*/
callBack.solve(result);
}
}
/**
* 测试类
* @author Administrator
*
*/
public class Test {
public static void main(String[] args) {
//两个对象一个我一个你
You you = new You();
Me me = new Me(you);
//我向你提问
me.askQqstion("世界到底有多大?");
}
}
输出结果:
你告诉我的答案是—>答案就是我也不知道
回调函数(方法)小总结:
1.回调函数也是一个函数或过程,不过它是一个由调用方自己实现,供被调用方使用的特殊函数。
2.即调用方A不直接使用此函数function,而是通过调用被调用方B来间接调用function。
通过上面的那个例子你是不是差不多明白了回调机制呢,上面是一个异步回调,就是我去做我的事但是我还是在等你的答案,相应的也有同步回调。线程run()也是一个回调方法,当执行Thread的start()方法就会回调这个run()方法,还有处理消息都比较经典等等
Android中的回调机制
比较笨的一种认识:Android中以on开头的方法都是回调方法:onCreate (),onStart (),onPause (),onStop()等等。
在Activity中定义了很多生命周期的不同状态要调用的方法,这些方法都是空实现,系统框架要调用,用户也要调用来实现。
1.以上可以看出,接口(系统框架)是系统提供的,接口的实现是用户实现的,这样可以达到接口统一,实现不同的效果。
2.系统在不同的状态“回调”我们的实现类,来达到接口和实现的分类。