我相信大家在写java的时候经常会听到什么“回调这”“回调那”等等一系列和java回调有关的东西,年少无知的时候,我一直不是太理解
“回调”这个东西是什么,后来知道了java回调这个东西。
那到底什么是回调呢?
其实,所谓的回调,简单点来说,就是一个类(A)调用另一个类(B)中的方法,然后后面这个类(B)再回过头来调用前面那个类(A)的某个方法C,这个方法C就是我们所说的回调方法。也就是说在java里面实现回调需要以下几个条件:
1. 有一个CallBack接口
2. Class A 实现了这个CallBack接口
3. Class B 中有一个参数为CallBack接口对象的方法f
4. Class A 中有一个Class B的对象引用
5. Class A 通过Class B的对象引用来调用Class B中那个带有CallBack对象参数的方法f
6. Class B可以在f方法中(当然不是一定要在f方法中,只要能确保在拿到Class A的对象后即可)回过头调用Class A的方法C
对于方法调用,其实可以分为:同步调用,异步调用和回调,它们之间的区别在于:同步调用是有阻塞的调用,也是最常用的调用方式,异步调用类似于操作系统中的消息机制,可以一定程度上解决同步调用会阻塞的问题,而今天所讲的回调从前面的介绍也可以看出它是一种双向调用,你调用我,我再反过来调用你,回调可以说是异步调用的基础和前提。
举个栗子:
先来个CallBack接口:
public interface CallBack
{
public void call();
}
接着,Class B 中有一个参数为CallBack接口对象的方法setCallBack
然后,Class B可以在拿到A的对象后在method方法中回过头调用Class A的call方法
public class B
{
public CallBack callback;
public void setCallBack(CallBack callback)
{
this.callback = callback;
}
public void method(){
this.callback.call();
}
}
Class A 实现这个CallBack接口
然后,Class A 中有一个Class B的对象引用b
再然后,类A中的b调用类B中的方法setCallBack设置接口对象为A的对象,然后再调用method方法:
public class A implements CallBack
{
public void call()
{
System.out.println("我被回调啦");
}
public static void main(String args[])
{
B b = new B();
b.setCallBack(new A());
b.method();
}
}
我们可以参考Android中典型的Button控件的源代码来看(有些代码省略了):
public class View {
/**
* Listener used to dispatch click events.
* This field should be made private, so it is hidden from the SDK.
* {@hide}
*/
protected OnClickListener mOnClickListener;
/**
* 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)
*/
//setOnClickListener()的参数是OnClickListener接口对象
public void setOnClickListener(OnClickListener l) {
if (!isClickable()) {
setClickable(true);
}
mOnClickListener = l;
}
/**
* Call this view's OnClickListener, if it is defined.
*
* @return True there was an assigned OnClickListener that was called, false
* otherwise is returned.
*/
public boolean performClick() {
sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_CLICKED);
if (mOnClickListener != null) {
playSoundEffect(SoundEffectConstants.CLICK);
//B类反过来调用A类的方法onClick,这个方法onClick就是回调方法
mOnClickListener.onClick(this);
return true;
}
return false;
}
}
想想我们是如何在Android中使用Button的,是不是先实现OnClickListener接口,然后再获得Button对象,接着调用Button对象的setOnClickListener方法,然后在接口方法onClick中实现具体的逻辑,当你点击这个Button的同时你之前在onClick写的逻辑是不是就被回调了? 没错,Button的点击事件就是Java回调的典型表现。
以上是个人愚见,欢迎批评指正。