回调函数
最简单的回调函数场景:有A类和B类,A类的C方法,B类的D方法
A需要调用B类的D方法,而B类的D方法又需要调用A类的C方法,也就是相互调用。
简单的回调函数使用可以参考如下代码
/**
* 回调函数
*/
public interface Callback {
void meet(ScheduleTable schedule);
}
/**
Boss类 实现CallBack接口
**/
public class Boss implements CallBack{
private Secretary mSecretary;
public Boss(Secretary secretary) {
this.mSecretary = secretary;
}
/**
* 从秘书这拿到时间表后,boss开始干活
*/
public void meet(ScheduleTable schedule) {
// 出去跑业务
}
/**
* 吩咐秘书做一个时间表
*/
public assignTask() {
mSceretary.makeScheduleTable(this);
}
}
/**
秘书类
**/
public class Secretary {
/**
* 创建时间表
*/
public void makeScheduleTable(CallBack callback) {
ScheduleTable schedule = new ScheduleTable();
callback.meet(schedule);
}
}
Android中View的点击事件
在学习最简单的Button使用的时候,都会写这么一个函数setOnClickListener()
,然后要么写一个匿名OnClickListener传进去作为参数,要么Activity/Fragment实现OnClickListener的接口
那么看下View的源码里setOnClickListener是怎么实现的
public void setOnClickListener(@Nullable OnClickListener l) {
if (!isClickable()) {
setClickable(true);
}
getListenerInfo().mOnClickListener = l;
}
其中
static class ListenerInfo {
protected OnFocusChangeListener mOnFocusChangedListener;
protected OnClickListener mOnClickListener;
// ...
//拥有相关的各种回调函数
}
也就是说,让View里的static类ListenerInfo持有了我们定义的CallBack,那么这个CallBack什么时候生效呢,源码中有一个performClick()
函数
public boolean performClick() {
final boolean result;
final ListenerInfo li = mListenerInfo;
// 判断listenerInfo是否存在 并且是否有callback
if (li != null && li.mOnClickListener != null) {
playSoundEffect(SoundEffectConstants.CLICK);
li.mOnClickListener.onClick(this); // 执行callback中相应的函数,这里是onClick(View)
result = true;
} else {
result = false;
}
sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_CLICKED);
notifyEnterOrExitForAutoFillIfNeeded(true);
// 返回值为true时表示调用的是传入的callback,否则为false
return result;
}
这是一个很典型的回调函数的例子