【安卓笔记】回调

 
   
无奈身边没有一本可供参考的书(书到用时方恨少),网上看了一大堆,头疼之外也不知所言正确与否。在此理一下。

 

弄清楚下面几点:

1.回调函数是什么?

2.回调函数有什么作用?

3.回调函数怎样实现?

 

1.回调函数是什么?

先看wiki和百度百科

Wiki计算机程序设计中,回调函数,或简称回调Callback),是指通过函数参数传递到其它代码的,某一块可执行代码引用。这一设计允许了底层代码调用在高层定义的子程序

 

非常……高深的样子,简直让人望而却步

百度百科:回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。

 

嗯,这个比较人性化一点。相信wiki和百度百科还是有一定可信度的吧,只是,还是挺抽象的,那么继续

网上的这么一段解释,在很多地方看到

 

详细解释:
       
  客户程序C调用服务程序S中的某个函数A,然后S又在某个时候反过来调用C中的某个函数B,对于C来说,这个B便叫做回调函数。例如Win32下的窗口过程函数就是一个典型的回调函数。一般说来,C不会自己调用BC提供B的目的就是让S来调用它,而且是C不得不提供。由于S并不知道C提供的B姓甚名谁,所以S会约定B的接口规范(函数原型),然后由C提前通过S的一个函数R告诉S自己将要使用B函数,这个过程称为回调函数的注册,R称为注册函数。Web Service以及JavaRMI都用到回调机制,可以访问远程服务器程序。
下面举个通俗的例子:
       
  某天,我打电话向你请教问题,当然是个难题,^_^,你一时想不出解决方法,我又不能拿着电话在那里傻等,于是我们约定:等你想出办法后打手机通知我,这样,我就挂掉电话办其它事情去了。过了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

 

猜你喜欢

转载自crazysumer.iteye.com/blog/1845736