【番外篇】Java 回调


我相信大家在写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回调的典型表现。


以上是个人愚见,欢迎批评指正。



  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值