天天看點

【轉載】談談我對Java中CallBack的了解

談談我對Java中CallBack的了解

轉載自: http://www.cnblogs.com/codingmyworld/archive/2011/07/22/2113514.html

  CallBack是回調的意思,熟悉Windows程式設計的人對"回調函數"這四個字一定不會陌生,但是Java程式員對它可能就不太了解了。"回調函數"或者"回調方法"是軟體設計與開發中一個非常重要的概念,掌握"回調函數"的思想對程式員來說(不管用哪種語言)是非常必要的。

  那麼什麼是回調函數呢?我認為,回調函數就是預留給系統調用的函數,而且我們往往知道該函數被調用的時機。這裡有兩點需要注意:第一點,我們寫回調函數不是給自己調用的,而是準備給系統在将來某一時刻調用的;第二點,我們應該知道系統在什麼情形下會調用我們寫的回調函數。

  這裡舉個現實生活中"回調函數"的例子來幫助大家更好的了解。我們平時考試答題的第一件事是幹嘛?沒錯,是寫上學号和姓名。這裡注意了,我們填寫學号和姓名不是給自己看的(即該方法不是給自己調用的),而是給老師登記分數時看的(預留給系統将來調用),這其實就是一個回調的應用。

下面再來看一下Android中應用到"回調"的場景。

場景一:

Button button = (Button)this.findViewById(R.id.button);
button.setOnClickListener(new Button.OnClickListener() {
 
//回調函數
@override
public void onClick(View v) {
   buttonTextView.setText("按鈕被點選了");
}
});           

上面的代碼給按鈕加了一個事件監聽器,這其實就是"回調"最常見的應用場景之一。我們自己不會顯示地去調用onClick方法。使用者觸發了該按鈕的點選事件後,它會由Android系統來自動調用。

場景二:

@Override
public void onCreate(Bundle saveInstanceState) {
super.onCreate(saveInstanceState);
// You code...
}
 
@Override
public void onResume() {
super.onResume();
// You code...
}           

上面的方法大家就更熟悉了,這是Android系統在Activity類中設定的回調函數,在Activity生命周期的不同階段,Android系統會自動調用相應的方法(onCreate, onPause, onResume,onDestroy等等)

以上是兩個Android中用到"回調"的場景,他們的代碼實作可能不同,但是思想上是相近的,都是"回調"思想的展現。下面,我們在Java中分别模拟這兩個場景。

首先模拟注冊事件監聽器。先寫一個監聽器接口

package com.listener;
 
/**
* 點選監聽器接口
* @author CodingMyWorld
*
*/
public interface MyOnClickListener {
   publicvoid onClick();
}           

然後寫一個我們自己的Button類

package com.listener;
 
public class MyButton {
   private MyOnClickListener listener;
 
   /**
    * 設定具體點選監聽器
    * @param listener 點選監聽器實作類
    */
   public void setOnClickListener(MyOnClickListener listener) {
       this.listener = listener;
   }
 
   /**
    * 按鈕被點選
    */
   public void doClick() {
       listener.onClick();
   }
}           

最後模拟Client端的注冊監聽器和觸發點選操作。

package com.listener;
 
public class Client {
   public static void main(String[] args) {
       MyButton button =new MyButton();
       //注冊監聽器
       button.setOnClickListener(new MyOnClickListener() {
 
           @Override
           public void onClick() {
               System.out.println("按鈕被點選了");
 
           }
 
       });
       //模拟使用者點選
       button.doClick();
   }
}           

以上就是"回調"思想在Java中事件監聽的運用,我們再模拟第二個場景,"回調"在activity生命周期方法調用的展現。由于比較簡單,我就不多做解釋了,大家直接看代碼。

package com.activity;
 
public abstract class Activity {
   protected void onCreate() {
       System.out.println("建立準備~~~~~~~");
   }
 
   protected void onDestroy() {
       System.out.println("銷毀準備~~~~~~~~");
   }
}           
package com.activity;
 
public class ConcreteActivity extends Activity {
   @Override
   protected void onCreate() {
       super.onCreate();
       System.out.println("建立中!!!");
   }
 
   @Override
   protected void onDestroy() {
       super.onDestroy();
       System.out.println("銷毀中!!!");
   }
}           
package com.activity;
 
public class Client {
   public static void main(String[] args) {
       Activity activity =new ConcreteActivity();
       activity.onCreate();
       activity.onDestroy();
   }
}           

繼續閱讀