概述
我们先看一下维基百科对回调函数的定义:
在计算机程序设计中,回调函数,或简称回调(Callback 即call then back 被主函数调用运算后会返回主函数),是指通过函数参数传递到其它代码的,某一块可执行代码的引用。这一设计允许了底层代码调用在高层定义的子程序。
举个栗子
我们看一下android中最经典的View.setOnClickListener()源码:
1.定义接口<View类中>
/**
* Interface definition for a callback to be invoked when a view is clicked.
*/
public interface OnClickListener {
/**
* Called when a view has been clicked.
*
* @param v The view that was clicked.
*/
void onClick(View v);
}
2.注册回调函数<View类中>
/**
* Register a callback to be invoked when this view is clicked. If this view is not
* clickable, it becomes clickable.
*
* @param l The callback that will run
*
* @see #setClickable(boolean)
*/
public void setOnClickListener(@Nullable OnClickListener l) {
if (!isClickable()) {
setClickable(true);
}
getListenerInfo().mOnClickListener = l;
}
3.执行回调函数<View类中>
/**
* Call this view's OnClickListener, if it is defined. Performs all normal
* actions associated with clicking: reporting accessibility event, playing
* a sound, etc.
*
* @return True there was an assigned OnClickListener that was called, false
* otherwise is returned.
*/
public boolean performClick() {
final boolean result;
final ListenerInfo li = mListenerInfo;
if (li != null && li.mOnClickListener != null) {
playSoundEffect(SoundEffectConstants.CLICK);
li.mOnClickListener.onClick(this);
result = true;
} else {
result = false;
}
sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_CLICKED);
return result;
}
4.调用View的注册回调函数方法<MainActivity中>
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//do something
}
});
ok了,这样就完成了一次完整的回调函数.
总结一下
首先,在MainActivity中通过View中的setOnclickListener方法的参数将OnClickListener 接口的实现者传给了View,最终在被点击时在performClick方法中,执行了实现者的onClick方法.
是不是就如维基百科上的回调定义:通过函数参数传递到其它代码的,某一块可执行代码的引用.O(∩_∩)O.
网友评论