回调这种思想大家应该都用过,只是很多人不知道那是回调的一种罢了,前几天整理了一下自己对于回调的理解,就顺便把自己的一些想法整理到博客中。
?
让我们从一个小故事开始。
OK,这个故事我们先告一段落,其实,这就是一个典型的回调过程。
C不会自己调用b,C提供b的目的就是让S来调用它,而且C不得不提供。S并不知道C提供的b是什么,因此S会约定b的接口规范(函数原型),然后由C提前通过S的一个函数r告诉S自己将要使用b函数(即注册)。r为注册函数。
简单来说:
回调函数就是预留给系统调用的函数,而且我们往往知道该函数被调用的时机
好的,那我们继续完善下上面的那幅图。
看着这幅图,其实我们回想一下,会发现,生活中到处都有回调这种思想存在。软件的很多思想其实只是我们实际生活中思维方式的一种转化。
再将一个小故事:
好的,我们已经大概知道了回调的基本流程,下面,来看看Android中回调的基本使用。
场景一:
- Button?button?=?(Button)this.findViewById(R.id.button);??
- button.setOnClickListener(newButton.OnClickListener()?{??
- ??
- //回调函数??
- @override??
- publicvoidonClick(View?v)?{??
- buttonTextView.setText("按钮被点击了");??
- }??
- });??
熟悉的组件,熟悉的监听器。。。
场景二:
- @Override??
- publicvoidonCreate(BundlesaveInstanceState)?{??
- ??super.onCreate(saveInstanceState);??
- ?//?You?code...??
- }??
- @Override??
- publicvoidonResume()?{??
- ??super.onResume();??
- ?//?You?code...??
- }??
Activity的整个生命周期基本上都说回调函数在发挥作用。
?
- //声明一个接口??
- public?interface?ICallBack?{??
- ????void?postExec();??
- }??
- //另外一个类有方法里面有个参数是这个接口类型的对象??
- public?class?FooBar?{??
- ????private?ICallBackcallBack;??
- ????public?void?setCallBack(ICallBackcallBack)?{??
- ????????this.callBack?=callBack;??
- ????}??
- ????public?void?doSth()?{??
- ????????callBack.postExec();??
- ????}??
- }??
- //实现回调??
- public?class?Test?{??
- ????public?static?void?main(String[]?args)?{??
- ????????FooBarfoo?=?newFooBar();??
- ????????foo.setCallBack(newICallBack()?{??
- ????????????public?void?postExec()?{??
- ????????????????System.out.println("method?executed.");??
- ????????????}??
- ????????});??
- ????????foo.doSth();//调用函数??
- ????}??
- }??
对回调的深入思考:
程序的本质就是代码跳转,不管同步异步反射接口虚函数,本质上都是函数调用。函数我们要调用它,就需要它的指针,不同语言通过不同的方式来得到这个指针。而我们定义的接口其实就是一个函数指针,那么那个注册过程,其实就是相当于对那个函数指针赋值。通过这个函数指针来调用我们定义的自实现函数。利用函数指针实现回调,在RIL的C代码中无处不在,大家可有空研习。