无奈身边没有一本可供参考的书(书到用时方恨少),网上看了一大堆,头疼之外也不知所言正确与否。在此理一下。
弄清楚下面几点:
1.回调函数是什么?
2.回调函数有什么作用?
3.回调函数怎样实现?
1.回调函数是什么?
先看wiki和百度百科
Wiki:在计算机程序设计中,回调函数,或简称回调(Callback),是指通过函数参数传递到其它代码的,某一块可执行代码的引用。这一设计允许了底层代码调用在高层定义的子程序。
非常……高深的样子,简直让人望而却步
百度百科:回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。
嗯,这个比较人性化一点。相信wiki和百度百科还是有一定可信度的吧,只是,还是挺抽象的,那么继续
网上的这么一段解释,在很多地方看到
详细解释:
客户程序C调用服务程序S中的某个函数A,然后S又在某个时候反过来调用C中的某个函数B,对于C来说,这个B便叫做回调函数。例如Win32下的窗口过程函数就是一个典型的回调函数。一般说来,C不会自己调用B,C提供B的目的就是让S来调用它,而且是C不得不提供。由于S并不知道C提供的B姓甚名谁,所以S会约定B的接口规范(函数原型),然后由C提前通过S的一个函数R告诉S自己将要使用B函数,这个过程称为回调函数的注册,R称为注册函数。Web Service以及Java的RMI都用到回调机制,可以访问远程服务器程序。
下面举个通俗的例子:
某天,我打电话向你请教问题,当然是个难题,^_^,你一时想不出解决方法,我又不能拿着电话在那里傻等,于是我们约定:等你想出办法后打手机通知我,这样,我就挂掉电话办其它事情去了。过了XX分钟,我的手机响了,你兴高采烈的说问题已经搞定,应该如此这般处理。故事到此结束。这个例子说明了“异步+回调”的编程模式。其中,你后来打手机告诉我结果便是一个“回调”过程;我的手机号码必须在以前告诉你,这便是注册回调函数;我的手机号码应该有效并且手机能够接收到你的呼叫,这是回调函数必须符合接口规范。
这个详细解释我可以这样翻译么?
![]() |
|
通俗解释很感人,但是我还没有跟具体的东东对上号,先看
2.回调函数有什么作用?
回调函数主要用于一些比较费时的操作,或响应不知道何时将会发生的事件,回调函数提供了一种异步的机制,相对于同步执行,提高了效率.
3.回调函数怎么实现?
(1)定义一个回调函数的接口ICallback,里面有一些方法的申明
(2)调用者Caller中声明一个 ICallback对象,并实现它(可在Caller中以内部类的形式,也可另行实现)
(3)当特定条件或事件发生时,调用ICallback的实现中的函数,对事件进行处理。
自定义的接口
public interface ICallback { public void sayHello(); //do something else }
自定义接口的实现
public class Callee implements ICallback{ @Override public void sayHello() { Log.d(Callee.class.getName(), "Callee: Hello World!"); } //do something else }
调用者
public class Caller { private ICallback iCallback; public Caller() { } public Caller(ICallback iCallback) { this.iCallback = iCallback; } public void say1() { iCallback.sayHello(); } public void say2() { Log.d(Caller.class.getName(), "just test");// can be printed new ICallback() { @Override public void sayHello() { Log.d(Caller.class.getName(), "Anonymous inner classes:Hello World!");// can not be // printed } }; } }
Test
public class Test extends TestCase { public void testCallback(){ Caller c = new Caller(); c.say2(); Callee ce = new Callee(); Caller c1 = new Caller(ce); c1.say1(); } }
输出(匿名内部类方式没有输出?!Why?)
写在最后:
所以回调函数到底是什么呢?回调函数就是实现方不调用,而提供给别人(调用者)调用的函数,这一调用会在调用者的某个动作后触发
Android很多回调函数,所以是这个意思吗?(在Activity上有一个按钮,给按钮添加点击事件)
所以上面那个详细解释其实应该这样翻译么?
Activity就是程序C,在Activity的onCreate方法中调用setOnClickListener这个注册函数,程序S暂且称他为系统,在调用onCreate方法后,监听就被注册了,当点击按钮时,就调用方法B,也就是onClick,进行处理
嗯,总感觉只看到调,没有一种回调的感觉,不是应该顾名思义么
参考:
http://heyshadow.blog.163.com/blog/static/57503343200842192115379/
http://www.cnblogs.com/babytrace/archive/2012/04/07/2437125.html
http://www.androidkaifa.com/thread-3677-1-1.html