什么是回调:

回调函数就是通过函数指针(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点击事件的源码,还有通过上面四个步骤,我想大家现在应该可以很容易的写一个回调函数了,当你不知道一个方法中的具体逻辑的时候,很容易就想到

通过接口的形式暴露出去交给具体的执行的人去实现具体的逻辑,而整个过程中需要对接口引用进行传递,这个就是回调的本质。