什么是回调:
回调函数就是通过函数指针(Android中的引用)调用的函数。
如果你把参数指针作为参数传递给另外一个函数,当这个指针被用来调用其指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在待定的事件或条件发生时,由另外的函数调用,对于该事件或条件进行响应。
(什么鬼,这是百度百科的解释,作为Android开发人员,如果没有C语言基础,可能看的一头雾水)
Android翻译官:
回调方法就是通过对象引用调用方法。(你在说啥?)
举个例子:
现在有这样一个需求:就是A类中有一个控件,当用户点击(或者滑动等操作)的时候,需要在B类中做出有回应的操作(比如请求网络等)。因为A类根本不知道用户啥时候点击这个控件,所以没办法做出具体的逻辑(说到这里很多人应该想到了接口这个词,恭喜你,你已经有了思路了),那该怎么办呢?这个时候就要用到回调。
怎么写回调方法:
回调就是一种简单的观察者模式,它的本质就是引用的传递。
观察者设计模式的使用
步骤:
1.找出被观察者,被观察者的特点就是事件的发生者
2.定义观察者,就是定义一个接口,接口中的方法就是观察者感兴趣的事件
3.在被观察者中保存观察者的引用
4.事件发生的时候通知观察者
我们写回调函数就用上面四个步骤。
下面用Button点击事件通过源码来做详细的讲解:
Button button = new Button(this);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
// 1.找出被观察者,被观察者的特点就是事件的发生者(我们这里事件发生者就是Button,第一步很简单)
//2.定义观察者,就是定义一个接口,接口中的方法就是观察者感兴趣的事件
/**
* Interface definition for a callback to be invoked when a view is clicked.
*/
public interface OnClickListener { //此时OnClickListener就是定义的观察者
/**
* Called when a view has been clicked.
*
* @param v The view that was clicked.
*/
void onClick(View v); //而观察者所感兴趣的事件就是点击事件
}
//3.在被观察者中保存观察者的引用
/**
* Listener used to dispatch click events.
* This field should be made private, so it is hidden from the SDK.
* {@hide}
*/
public OnClickListener mOnClickListener;
//4.事件发生的时候通知观察者
/**
* 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;
}
总结:
通过分析Button点击事件的源码,还有通过上面四个步骤,我想大家现在应该可以很容易的写一个回调函数了,当你不知道一个方法中的具体逻辑的时候,很容易就想到
通过接口的形式暴露出去交给具体的执行的人去实现具体的逻辑,而整个过程中需要对接口引用进行传递,这个就是回调的本质。