【转】谈谈我对Java中CallBack的理解

原文地址:http://xixinfei.iteye.com/blog/1306236

 

CallBack是回调的意思,熟悉Windows编程的人对"回调函数"这四个字一定不会陌生,但是Java程序员对它可能就不太了解了。"回调 函数"或者"回调方法"是软件设计与开发中一个非常重要的概念,掌握"回调函数"的思想对程序员来说(不管用哪种语言)是非常必要的。

那么什么是回调函数呢?我认为,回调函数就是预留给系统调用的函数,而且我们往往知道该函数被调用的时机。这里有两点需要注意:第一点,我们写回调函数不是给自己调用的,而是准备给系统在将来某一时刻调用的;第二点,我们应该知道系统在什么情形下会调用我们写的回调函数。

这里举个现实生活中"回调函数"的例子来帮助大家更好的理解。我们平时考试答题的第一件事是干嘛?没错,是写上学号和姓名。这里注意了,我们填 写学号和姓名不是给自己看的(即该方法不是给自己调用的),而是给老师登记分数时看的(预留给系统将来调用),这其实就是一个回调的应用。

下面再来看一下Android中应用到"回调"的场景。

场景一:

1 Button button = (Button)this.findViewById(R.id.button);
2 button.setOnClickListener(new Button.OnClickListener() {
3 
4   //回调函数
5   @override
6   publicvoid onClick(View v) {
7     buttonTextView.setText("按钮被点击了");
8   }
9 });

上面的代码给按钮加了一个事件监听器,这其实就是"回调"最常见的应用场景之一。我们自己不会显示地去调用onClick方法。用户触发了该按钮的点击事件后,它会由Android系统来自动调用。

场景二:

 1 publicvoid onCreate(Bundle saveInstanceState) {
 2   super.onCreate(saveInstanceState);
 3   // You code...
 4 }
 5 
 6 @Override
 7 publicvoid onResume() {
 8   super.onResume();
 9   // You code...
10 }

上面的方法大家就更熟悉了,这是Android系统在Activity类中设置的回调函数,在Activity生命周期的不同阶段,Android系统会自动调用相应的方法(onCreate, onPause, onResume,onDestroy等等)

以上是两个Android中用到"回调"的场景,他们的代码实现可能不同,但是思想上是相近的,都是"回调"思想的体现。下面,我们在Java中分别模拟这两个场景。

首先模拟注册事件监听器。先写一个监听器接口

 1 package com.listener;
 2 
 3 /**
 4  * 点击监听器接口
 5  * @author CodingMyWorld
 6  *
 7  */
 8 publicinterface MyOnClickListener {
 9     publicvoid onClick();
10 }

然后写一个我们自己的Button类

 1 package com.listener;
 2 
 3 publicclass MyButton {
 4     private MyOnClickListener listener;
 5     
 6     /**
 7      * 设置具体点击监听器
 8      * @param listener 点击监听器实现类
 9      */
10     publicvoid setOnClickListener(MyOnClickListener listener) {
11         this.listener = listener;
12     }
13     
14     /**
15      * 按钮被点击
16      */
17     publicvoid doClick() {
18         listener.onClick();
19     }
20 }

最后模拟Client端的注册监听器和触发点击操作。

 1 package com.listener;
 2 
 3 publicclass Client {
 4     publicstaticvoid main(String[] args) {
 5         MyButton button =new MyButton();
 6         //注册监听器
 7         button.setOnClickListener(new MyOnClickListener() {
 8 
 9             @Override
10             publicvoid onClick() {
11                 System.out.println("按钮被点击了");
12                 
13             }
14             
15         });
16         //模拟用户点击
17         button.doClick();
18     }
19 }

以上就是"回调"思想在Java中事件监听的运用,我们再模拟第二个场景,"回调"在activity生命周期方法调用的体现。由于比较简单,我就不多做解释了,大家直接看代码。

 1 package com.activity;
 2 
 3 publicabstractclass Activity {
 4     protectedvoid onCreate() {
 5         System.out.println("创建准备~~~~~~~");
 6     }
 7     
 8     protectedvoid onDestroy() {
 9         System.out.println("销毁准备~~~~~~~~");
10     }
11 }
 1 package com.activity;
 2 
 3 publicclass ConcreteActivity extends Activity {
 4     @Override
 5     protectedvoid onCreate() {
 6         super.onCreate();
 7         System.out.println("创建中!!!");
 8     }
 9     
10     @Override
11     protectedvoid onDestroy() {
12         super.onDestroy();
13         System.out.println("销毁中!!!");
14     }
15 }
1 package com.activity;
2 
3 publicclass Client {
4     publicstaticvoid main(String[] args) {
5         Activity activity =new ConcreteActivity();
6         activity.onCreate();
7         activity.onDestroy();
8     }
9 }

OK,我对CallBack的理解就谈到这,有不对和能改进的地方也希望大家指正,多多交流。

posted @ 2014-07-03 09:19  佑车道  阅读(191)  评论(0编辑  收藏  举报