天天看點

通俗易懂 - 監聽器實作、回調函數。

我們用好簡單的例子和代碼來說明監聽器的實作也及回調怎麼寫。

背景:女孩叫男朋友出去玩時,男朋友在打遊戲。

  1. 女孩有了一個男朋友。
  2. 女孩說:你打完了叫了,我們再一起出去玩。
  3. 男朋友同意了,并記下了。
  4. 遊戲打完了,男朋友喊了女朋友,女孩聽到後就叫男朋友出去玩
  5. 男朋友說再打一局。
為了女孩不要傻等男朋友打完遊戲,女孩設定了一個監聽器,監聽男朋友遊戲進度。監聽如果監聽到遊戲結束,就回調已經女孩事先已經想好的事件。而女孩就可以在男朋友打遊戲時做自己想做的事(比如化妝等)。這樣就可以多線程跑,而不因為男孩的遊戲阻塞讓女朋友線程一直等待。

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: 不行,我要再來一局
           

是不是通俗易懂,那我們現在再看百科的概念:

回調函數就是一個通過函數指針調用的函數。如果你把函數的指針(位址)作為參數傳遞給另一個函數,當這個指針被用來調用其所指向的函數時,我們就說這是回調函數。回調函數不是由該函數的實作方直接調用,而是在特定的事件或條件發生時由另外的一方調用的,用于對該事件或條件進行響應。