我们用好简单的例子和代码来说明监听器的实现也及回调怎么写。
背景:女孩叫男朋友出去玩时,男朋友在打游戏。
- 女孩有了一个男朋友。
- 女孩说:你打完了叫了,我们再一起出去玩。
- 男朋友同意了,并记下了。
- 游戏打完了,男朋友喊了女朋友,女孩听到后就叫男朋友出去玩
- 男朋友说再打一局。
为了女孩不要傻等男朋友打完游戏,女孩设置了一个监听器,监听男朋友游戏进度。监听如果监听到游戏结束,就回调已经女孩事先已经想好的事件。而女孩就可以在男朋友打游戏时做自己想做的事(比如化妆等)。这样就可以多线程跑,而不因为男孩的游戏阻塞让女朋友线程一直等待。
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: 不行,我要再来一局
是不是通俗易懂,那我们现在再看百科的概念:
回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。