我們用好簡單的例子和代碼來說明監聽器的實作也及回調怎麼寫。
背景:女孩叫男朋友出去玩時,男朋友在打遊戲。
- 女孩有了一個男朋友。
- 女孩說:你打完了叫了,我們再一起出去玩。
- 男朋友同意了,并記下了。
- 遊戲打完了,男朋友喊了女朋友,女孩聽到後就叫男朋友出去玩
- 男朋友說再打一局。
為了女孩不要傻等男朋友打完遊戲,女孩設定了一個監聽器,監聽男朋友遊戲進度。監聽如果監聽到遊戲結束,就回調已經女孩事先已經想好的事件。而女孩就可以在男朋友打遊戲時做自己想做的事(比如化妝等)。這樣就可以多線程跑,而不因為男孩的遊戲阻塞讓女朋友線程一直等待。
Main類:
public class Main {
public static void main(String[] args){
//女孩有了一個男朋友,好恩愛。(具有男朋友屬性)
GirlFriend girlFriend=new GirlFriend();
//女孩說:你打完了叫了,我們再一起出去玩。(具有監聽器并初始化監聽器)
girlFriend.initListener();
//男朋友同意了,并記下了。(設定男朋友的遊戲監聽器)
girlFriend.setBoyFriendGameListener();
//遊戲打完了,男朋友喊了女朋友,女孩聽到後就叫男朋友出去玩(男朋友回調監聽代碼)
girlFriend.mBoyFriend.GameDefeated();
}
}
女朋友類:
public class GirlFriend {
BoyFriend mBoyFriend=new BoyFriend();
GameListener mGameListener;
public void initListener(){
mGameListener=new GameListener() {
@Override
public void GameOver() {
System.out.println(getClass().getName()+":走,一起出去玩");
}
};
}
public void setBoyFriendGameListener(){
mBoyFriend.setGameListener(mGameListener);
}
}
男朋友類:
public class BoyFriend {
GameListener gameListener;
//設定監聽接口
public void setGameListener(GameListener gameListener){
this.gameListener = gameListener;
}
//遊戲結束
public void GameDefeated(){
System.out.println("遊戲結束");
if(gameListener!=null){
gameListener.GameOver();
}
System.out.println(getClass().getName()+": 不行,我要再來一局");
}
}
監聽接口:
public interface GameListener {
public void GameOver();
}
運作結果:
遊戲結束
GirlFriend$1:走,一起出去玩
BoyFriend: 不行,我要再來一局
是不是通俗易懂,那我們現在再看百科的概念:
回調函數就是一個通過函數指針調用的函數。如果你把函數的指針(位址)作為參數傳遞給另一個函數,當這個指針被用來調用其所指向的函數時,我們就說這是回調函數。回調函數不是由該函數的實作方直接調用,而是在特定的事件或條件發生時由另外的一方調用的,用于對該事件或條件進行響應。