安卓回调机制

某天,我打电话向你请教问题,固然是个难题,你一时想不出解决方法,我又不能拿着电话在那里傻等,因而咱们约定:等你想出办法后打手机通知我,这样,我就挂掉电话办其它事情去了。过了XX分钟,个人手机响了,你兴高采烈的说问题已经搞定,应该如此这般处理。java

这就是一个典型的回调过程。android

C不会本身调用b,C提供b的目的就是让S来调用它,并且C不得不提供。S并不知道C提供的b是什么,所以S会约定b的接口规范(函数原型),而后由C提早经过S的一个函数r告诉S本身将要使用b函数(即注册)。r为注册函数。编程

简单来讲:服务器

回调函数就是预留给系统调用的函数,并且咱们每每知道该函数被调用的时机异步

好的,继续完善下上面的那幅图。ide

生活中处处都有回调这种思想存在。软件的不少思想其实只是咱们实际生活中思惟方式的一种转化。函数

再将一个小故事:post

咱们平时考试答题的第一件事是干吗?没错,是写上学号和姓名。这里注意了,咱们填写学号和姓名不是给本身看的(即该方法不是给本身调用的),而是给老师登记分数时看的(预留给系统未来调用),这其实就是一个回调的应用。老师提供接口(输入姓名,学号规则),咱们利用接口注册。
看到上面的小故事,你们对回调就有了一些了解了,咱们再回到开头的那个小故事。
那个故事说明了“异步+回调”的编程模式。其中,你后来打手机告诉我结果即是一个“回调”过程;个人手机号码必须在之前告诉你,这即是注册回调函数;个人手机号码应该有效而且手机可以接收到你的呼叫,这是回调函数必须符合接口规范。

知道了回调的基本流程,下面,来看看Android中回调的基本使用。this

场景一:spa

[java]  view plain  copy
 
  1. Button button = (Button)this.findViewById(R.id.button);  
  2. button.setOnClickListener(newButton.OnClickListener() {  
  3.   
  4. //回调函数  
  5. @override  
  6. publicvoidonClick(View v) {  
  7. buttonTextView.setText("按钮被点击了");  
  8. }  
  9. });  
 
上面的代码给按钮加了一个事件监听器,这其实就是“回调”最多见的应用场景之一。咱们本身不会显式地去调用onClick方法。用户触发了该按钮的点击事件后,它会由Android系统来自动调用。

熟悉的组件,熟悉的监听器。。。

场景二:

[java]  view plain  copy
 
  1. @Override  
  2. publicvoidonCreate(BundlesaveInstanceState) {  
  3.   super.onCreate(saveInstanceState);  
  4.  // You code...  
  5. }  
  6. @Override  
  7. publicvoidonResume() {  
  8.   super.onResume();  
  9.  // You code...  
  10. }  

Activity的整个生命周期基本上都说回调函数在发挥做用。

 

好了,看了两个咱们常常使用的回调方式,来总结下android利用回调的基本方法。其实,只是把咱们的那张图翻译了下。
首先,服务器端建立一个回调接口
 
[java]  view plain  copy
 
  1. //声明一个接口  
  2. public interface ICallBack {  
  3.     void postExec();  
  4. }  
  5. //另一个类有方法里面有个参数是这个接口类型的对象  
  6. public class FooBar {  
  7.     private ICallBackcallBack;  
  8.     public void setCallBack(ICallBackcallBack) {  
  9.         this.callBack =callBack;  
  10.     }  
  11.     public void doSth() {  
  12.         callBack.postExec();  
  13.     }  
  14. }  
  15. //实现回调  
  16. public class Test {  
  17.     public static void main(String[] args) {  
  18.         FooBarfoo = newFooBar();  
  19.         foo.setCallBack(newICallBack() {  
  20.             public void postExec() {  
  21.                 System.out.println("method executed.");  
  22.             }  
  23.         });  
  24.         foo.doSth();//调用函数  
  25.     }  
  26. }  
 

对回调的深刻思考:

程序的本质就是代码跳转,无论同步异步反射接口虚函数,本质上都是函数调用。函数咱们要调用它,就须要它的指针,不一样语言经过不一样的方式来获得这个指针。而咱们定义的接口其实就是一个函数指针,那么那个注册过程,其实就是至关于对那个函数指针赋值。经过这个函数指针来调用咱们定义的自实现函数。

相关文章
相关标签/搜索