接口回调(笔记

网上看了一堆,感觉有点零散,我自己总结一下。看评论区说存在很多问题,我读了一下,雀氏存在一些,非常感谢批评指正,我重新写一写。(ps:比较懒惰,随手改一改,大概是这么个意思)至于回调还细分成同步回调,异步回调。其实就是要不等B执行完A才执行,要不就是A交代给B,A就开始干其他的事。

回调定义

正式定义

回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。
回调函数就是一个被作为参数传递的函数。在C语言中,回调函数只能使用函数指针实现,在C++、Python、ECMAScript、Java等编程语言中可以使用仿函数或匿名函数。

这正式定义麻麻咋咋一大堆文字,愣是看得很吃力,反正看不懂就对了,瞅瞅通俗的定义,如果没看懂,瞧瞧更通俗的定义

通俗定义

在A类中定义了一个方法,这个方法中用到了一个接口和该接口中的抽象方法,但是抽象方法没有具体的实现,需要B类去实现,B类实现该方法后,它本身不会去调用该方法,而是传递给A类,供A类去调用,这种机制就称为回调。

如下图:其中在红色的waiting time中A啥也不做,单线程等待B执行完再继续执行就是同步回调,A不等待B,而是继续向下执行其他的事,就是异步回调。
1

更通俗解释:
其实小明玩游戏or干其他的事这个行为就相当于异步回调。如果小明啥也不干,一直等待小红完成了证明,然后自己收到了并copy完了,交完作业再去玩就是同步了。但是如果小红写了好几个小时才写出来的话,小明傻傻的等着也不是个事。而这在程序中就会出大问题,想想B阻塞时间过长,A还有其他很多任务要做,通常会导致A的方法没法正常执行下去。

小明写作业,遇到一道证明题,证明矩阵是正定的,但是小明不会啊,咋办呢?他就打了个电话给小红。
xm:这个证明题怎么做啊?
但是小红的作业中并没有这道题.
xh:你等我思考出来再告诉你。
小明听完后愉快地开机打游戏去了,约莫10分钟过去了,来电铃声突然想起,吓得小明手一抖就game over了,拿起手机一看,这不是小红嘛。
xh:这道题的解决方法我消息发给你了。
于是乎salty fish小明就这样写完了作业。

这一个过程呢,我们可以把小明看成class A,小红看成class B,A中定义了一个抽象方法,叫做证明矩阵正定,但是A没有实现它。于是交给了B,B实现了这个方法,但是B本身用不着,但是A要交作业啊,于是A 调用了B的这个实现方法。这个过程就是回调的一个过程。

回调机制

⑴定义一个回调函数;
⑵提供函数实现的一方在初始化的时候,将回调函数的函数指针注册给调用者;
⑶当特定的事件或条件发生的时候,调用者使用函数指针调用回调函数对事件进行处理。

回调意义

方法回调是功能定义和功能分离的一种手段,是一种松耦合的设计思想。在JAVA中回调是通过接口来实现的。作为一种系统架构,必须要有自己的运行环境,并且要提供用户的实现接口。
接口(系统框架)是系统提供的,接口的实现是用户实现的。这样可以达到接口统一,实现不同。系统通过在不同的状态“回调”我们的实现类,来达到接口和实现的分离。

接口回调的实现步骤

其实你会发现Android存在着大量回调

1.首先定义一个回调接口。(就是在Andorid Studio里面新建java,选择interface,or使用idea,这里使用idea,例子用小明,小红)

public interface CallBack {
    
    
    void solution(String answer);
}
  1. 小明发起帮助申请,小明不用实现接口方法的具体做法,他只需要暴露接口给小红,然后他接收答案。
public class XiaoMing{
    
    
    private String ans = null;//小明不知道答案
    public void callHelp(){
    
    
        System.out.println("小明: 美丽的小红,快把正定矩阵证明的过程答案给我看看。");
    }
    public void getAns(XiaoHong xh){
    
    
        xh.solution(ans);
        ans = xh.getAns();
        System.out.println("小明收到来自小红的回答: "+ans);
    }
}
  1. 小红实现证明过程
public class XiaoHong implements CallBack{
    
    
    private String ans;

    @Override
    public void solution(String answer) {
    
    
        System.out.println("小红:证明过程是这样的。");
        ans = "咯叽咯叽咯叽咯叽咯叽咯叽";
        setAns(ans);
        System.out.println("小红: "+ans);
    }
    public String getAns(){
    
    
        return ans;
    }
    private void setAns(String ans){
    
    
        this.ans = ans;
    }
}
  1. 主函数调用
public class MyMain {
    
    
    public static void main(String[] args){
    
    
        XiaoHong xh = new XiaoHong();
        XiaoMing xm = new XiaoMing();//小明要问的人是小红
        System.out.println("小明开始给小红打电话寻求帮助...");
        xm.callHelp();//小明寻求帮助
        xm.getAns(xh);//小明得到答案
    }
}

1

参考

博客https://blog.csdn.net/u010566681/article/details/52371359

脚本之家
https://www.jb51.net/article/74194.htm

知乎:https://zhuanlan.zhihu.com/p/349951124

猜你喜欢

转载自blog.csdn.net/qq_43738932/article/details/118787289