Java和Android回调机制
android,java2016-10-28
所谓回调,就是客户程序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中以on开头的方法都是回调方法:onCreate (),onStart (),onPause (),onStop()等等。
在Activity中定义了很多生命周期的不同状态要调用的方法,这些方法都是空实现,系统框架要调用,用户也要调用来实现。
1.以上可以看出,接口(系统框架)是系统提供的,接口的实现是用户实现的,这样可以达到接口统一,实现不同的效果。
2.系统在不同的状态“回调”我们的实现类,来达到接口和实现的分类。