代码编织梦想

说到接口回调,对于初学者来说,理解是真的难啊,不过没有关系,看完本篇文章,你马上就能理解接口回调啦!

概念

为了便于让大家都能无痛理解到接口回调,我决定用N个白话概念来给大家讲解,总有一种解说方式适合你:

解说1:A让B去做一件耗时(不一定耗时)的操作,而且并不知道要花费多少时间,B做完了后,告诉A事情做完了,并且把结果给A。当然,B在做这件事的时候,A还可以做其他事情。

解说2:世间总有我们难以到达的地方,比如人的胃出了问题,把头伸进去检查一下,肯定是不方便的,所以要用胃镜检查一下,就是下图这个玩意儿:
这里写图片描述
(妈妈,我在技术博客上居然看到了胃镜!)
然后我们直接将这个玩意儿伸进胃里,我估计病人就要开骂了,“你特么直接伸根管子进来要干嘛!“,确实,直接伸根管子进来,我想医生也不会做这种蠢事,然后医生会把这跟管子连接到一个特殊的仪器上,再伸管子进来,不然医生怎么看病人胃里啥情况,是吧?
如图仪器:
这里写图片描述
这个例子,我们再分析一下。管子伸进病人胃里,管子得到图像,并且将图像返回到仪器上。老实说管子和仪器其实在接口回调的思维方向中,应该是一体的,接口就是那根管子,提供提供一个得到图像的方法,仪器就是这个接口的具体实现,将接口得到的图像,显示到仪器上,医生就可以直接通过仪器看到图像了。

现在我们将这个例子,强行套上解说1中的A和B:仪器A让管子B去得到图像,仪器A也不知道管子B什么时候可以得到图像,当管子B得到图像后,马上返回给仪器A。当然,管子B在得到图像的过程中,仪器A还可以做其他事情,比如屏幕角落显示个时间啥的。

解说3: 假设我们有一根水管,通水后,一直在流水,如图:
20180926160728593
算了,还是动图好看:
20180926162551331
假设这是一个水管的截面图,水缓慢的从水管中流过,然后这个水管中有一些其他东西,就叫东西A吧,然后现在的水管是这个样子的:
20180926163915864
接下来,大家打算把这个东西A给拿出来,于是制作了一个专门能抓取A的抓取器B,在水管中间掏了一个孔,然后把B放了进来,先总结下:A是东西,B是抓取器,然后现在就是这样的
其中红色是B:
20180926165530791
然后现在东西A也被抓到了,那么就可以使用A了,由于B是一个抓取器,很多设备都可以和B直接连接,然后得到A,所以:

仪器1
20180926170503241
仪器2
20180926170919272

所以有很多仪器都能够连接到B,至于这些仪器拿到A干嘛,这就看每个仪器内部是怎么处理的了。

故事讲完了,接下来我要强行套用接口回调的事情了,首先在这个故事里面,我们出现了一个4种东西:

  1. 水中的A
  2. 专门获取A的B
  3. 可以和B连接的各种仪器

先说说接口回调的概念,白话文版本:接口回调就是,我们需要一个东西,而这个东西我们的仪器不能直接拿到,于是我们决定制作一个小器具深入其中,然后让那个小器具去得到我们需要的东西,这个小器具可以直接连接到我们的仪器,然后通过这个小器具把东西传给仪器。

我再把这句话稍微的加些专业词汇:接口回调就是,我们需要某些数据,但这些数据不能直接拿到,于是我们创建一个接口去帮我们拿,但接口毕竟是个接口,他啥也不能干,只能得到数据,所以我们需要这个接口的具体实现类,也就是上面白话文中的仪器。然后具体的实现类再来对数据进行处理。

大家看到上面这个概念,可能会有以下疑问:

  1. 啥数据啊,我还不能直接拿到?
  2. 为啥接口就可以拿到这些数据
  3. 啥叫接口啥也不能干啊,不能干为什么我们要用接口

问题1: 啥数据啊,我还不能直接拿到?
比如,我们写了如下代码,执行了一个data方法,是不是感觉这个data()方法毫无意义,假设这是平时开发中的某一个方法。

public class Main {

    public static void main(String[] args) {
        data();
    }


    private static void data() {
        int a = 100;
        int b = 200;
        int c = 300;
        int d = 400;
    }

}

现在有一个data方法,我们想得到data方法里面的 变量b 的数据,
(先别吐槽这些代码很蠢,在开发中经常会遇到这些情况的,要得到某个地方的数据,直接拿又不方便,那个地方的数据多如牛毛,而我只取某些数据。)

问题2: 为啥接口就可以拿到这些数据
看着啊,接口怎么拿到这些数据的。

public class Main {

    // 接口
    interface Callback {
        void getData(int x);
    }

    static Callback callback;

    public static void main(String[] args) {
        data();
    }


    private static void data() {
        int a = 100;
        int b = 200;
        if (callback != null) {
            callback.getData(b);
        }
        int c = 300;
        int d = 400;
    }

}

别跳,老老实实看代码,不难理解的。

看完之后一脸懵逼,大哥,这个接口有啥用,写在这里毫无意义啊。
我说你先别急,这时候抛出第三个问题:
问题3. 啥叫接口啥也不能干啊,不能干为什么我们要用接口
看到上面的代码,发现接口并没有任何卵用,为什么没卵用,因为这个接口啥也不是啊,就真的是个接口,没有被实现吧,没有被实现,怎么可能有用,那我们来实现下。

callback = new Callback() {
            @Override
            public void getData(int x) {
                System.out.println(x);
            }
        };

匿名类实现方式,嗯,讲究,这个时候整个代码的感觉就是这样的。

public class Main {

    // 接口
    interface Callback {
        void getData(int x);
    }

    static Callback callback;

    public static void main(String[] args) {

        callback = new Callback() {
            @Override
            public void getData(int x) {
                System.out.println(x);
            }
        };

        data();

    }


    private static void data() {
        int a = 100;
        int b = 200;
        if (callback != null) {
            callback.getData(b);
        }
        int c = 300;
        int d = 400;
    }

}

这个时候,运行打印出来的数据就是200了,我们完成了接口回调。

其中之一的小用途

假设有一个耗时的操作:在网上下载一张图片,我们并不知道下载这张图片具体要花费多少时间,于是我们开一个线程去下载图片,当该线程下载完图片后,把图片给需要的人。

用法

既然是接口回调,那就少不了接口啦:

public interface CallBack {
	void callBack(String picture);
}

这里我们定义了一个接口,并且设置了一个方法,方法里的参数就是B执行完后返回给A的结果。

那么这个接口该怎么用呢?

这里我们假设一个场景:A需要在网上下载一张图片,但是A并不知道下载这张图片需要多少时间,于是A开了一个线程B去下载这张图片,并且B下载完后将图片给A。

这个B线程我们应该怎么写?

public class MyThread extends Thread{

	private CallBack callBack;

	public MyThread(CallBack callBack) {
		this.callBack = callBack;
	}

	@Override
	public void run() {
		super.run();
		
		// 模仿耗时操作
		for (int i = 0; i < 10; i++) {
			try {
				Thread.sleep(500);
				System.out.println("图片下载中。。。(假装耗时)");
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		
		callBack.callBack("得的图片!!!");
		
	}
	
}

接下来我来解释下怎么理解这个线程中的接口。
我们在线程中声明了一个接口,主要是为了在耗时操作完成后,使用这个接口中的那个callBack(String picture)方法。将结果丢到这个方法的参数中。

但是卧槽!这不就是一个接口吗,方法体在哪里,就算把结果传给了这个方法里面又有什么卵用??
我的结果呢?哪去了!!!

带着这些疑问,我们开始使用这个构造方法含有接口的线程。

使用:

	MyThread myThread = new MyThread(new CallBack() {
			
			@Override
			public void callBack(String picture) {
				System.out.println(picture);
			}
		});
		
	myThread.start();

我们发现在使用这个线程的时候,需要在构造方法中传递一个已经实现了该接口的类,匿名类走起。
然后会在这个匿名类中生成一个方法,原来方法体在这里,我们发现这个方法还有可以利用的参数,没错!这个参数就是经过耗时操作返回给我们的结果,也就是那张图片!!
赶快运行一波!!!

运行结果:

图片下载中。。。(假装耗时)
图片下载中。。。(假装耗时)
图片下载中。。。(假装耗时)
图片下载中。。。(假装耗时)
图片下载中。。。(假装耗时)
图片下载中。。。(假装耗时)
图片下载中。。。(假装耗时)
图片下载中。。。(假装耗时)
图片下载中。。。(假装耗时)
图片下载中。。。(假装耗时)
得的图片!!!

这么简单易懂的代码真是骚的飞起!

这就是我对接口回调的理解及使用方法,希望你们看了这篇后再也不会为接口回调而烦恼!

源码下载:http://download.csdn.net/detail/it_xf/9790588

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/IT_XF/article/details/65058367

超级简单的接口回调-爱代码爱编程

本次博主要给大家讲一讲如何写一个简单的回调接口,对于初学者来说什么时候写回调接口,为什么写回调接口简直就是一头雾水,不知道大家是不是,反正我刚刚开始接触接口的时候就是这样一个状态。 什么是接口 : 网上的定义有很多,我就

接口回调用法解析_she_lock的博客-爱代码爱编程

应用场景:比如我写一个工具,下载任务,下载任务可能成功,可能失败。为了解耦,我的这个下载工具类只能专门用来下载,如何处理成功和失败,这个就交给调用方来完成。 回调接口 接口声明。 /** * @描述: 结果回调 *

java中的接口回调简单理解-爱代码爱编程

接口回调 在这里我用简单的语言先来解释一下:假设有两个类,分别是A和B,在A中有一个方法a(),B中有一个方法b();在A里面调用B中的方法b(),而方法b()中调用了方法a(),这样子就同时实现了b()和a()两个方法的

函数接口回调通俗易懂的理解-爱代码爱编程

    接口回调通俗的理解就A找B谈事情,结果B有其他事情在处理,现在不方便和A谈事情,于是他们约定在B处理完其他事情之后去通知A,我这边现在有时间了,我们可以谈论事情了,这样处理的好处就是在B处理其他事情的时候,A不用一直等着B,A可以先去处理其他事情,等B通知A之后,A再来处理这个事情。     这里面主要就是这个约定了,也就是函数回调里面定义的接口

如何快速理解接口回调?-爱代码爱编程

我觉得吧,很多文章接口回调太麻烦写的。 我们用接口回调的目的是什么? A咨询B一个问题,B无法立刻知道答案,所以B说我处理完后立刻回复你,然后A就不用傻等着了。 所以在B类中,我们需要设置监听: 1、设置callback对象,相当于B的观察者,calllback发现B想到答案了,则调用callback自带的onReponse(answer)方法,得到B的

巧妙理解接口回调-爱代码爱编程

接口回调目的和用法解析 一、为什么会有接口回调?什么是接口回调? 其实这两个问题是一个问题,知道了接口回调的原理自然就知道了为什么会有这么个东西。我们知道java中接口是不可以直接创建实例的,那么问题来了,假如我把一个接口声明为一个变量,那么我执行这个接口中的方法,接口没有实例它该怎么办呢?啊哈,这里自然又改出现java中的另一个特性—“多态”,这时j

java回调机制-经典例子说明-爱代码爱编程

在一个应用系统中, 无论使用何种语言开发, 必然存在模块之间的调用, 调用的方式分为几种: 1.同步调用 同步调用是最基本并且最简单的一种调用方式, 类A的方法a()调用类B的方法b(), 一直等待b()方法执行完毕, a()方法继续往下走. 这种调用方式适用于方法b()执行时间不长的情况, 因为b()方法执行时间一长或者直接阻塞的话, a()方法的余下代

接口回调-爱代码爱编程

接口回调 接口回调定义 接口和类一样,是Java中的一种数据类型,用接口声明的变量称之为接口变量接口变量中存储的是实现了该接口的类的实例的引用接口回调借用了C语言中指针回调的术语, 指针回调,表示一个变量的地址在某一时刻存放在一个 指针变量 中,这个 指针变量 可以间接操作该变量中存放的数据; 接口回调,指的是可以把实现某一接口的类创建的对象的引用

java 回调_用简易例子讲Java中的回调机制-爱代码爱编程

首先说点题外话。为什么要写这篇文章,因为在看J.U.C包的FutureTask源码的时候,有一个done()方法,这是个抽象方法,用户实现它之后,FutureTask会在执行完后调用这个方法。这就是回调机制,回调的思想就是: 类A调用类B的b方法类B的b方法执行完毕主动调用类A的callback()方法给出思想过于抽象,所以我会举出一个简单

什么是接口回调(一)-爱代码爱编程

在架构师的进阶道路上,离不开源码的阅读,离不开设计模式的熏陶,更离不开思想的传递,本章带你走进接口回调的设计道路! 1、什么是接口 这里简单复习下接口定义和概念: 接口用interface关键字声明接口不是类,是一组对类的需求描述,当中定义了很多统一的规范和协议实现接口的类,必须要按照接口统一制定的标准去编写更确切来说,接口是建立

java 回调方法是什么意思_java什么是回调-爱代码爱编程

日记网 >> 专题 java什么是回调 更新时间:2018/6/19 22:18:00  点击率:776  手机版 java什么是回调来自简单日记网精选推荐。软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用、回调和异步调用。同步调用是一种阻塞式调用,调用方要等待对方执行完毕才返回,它是一种单向调用;回调是一

java 接口回调的例子_java接口回调-爱代码爱编程

java的接口回调原理网上已经有很多生动形象的例子说明了,在此总结一下个人的理解:类A调用类B的方法b(),类B再回调类A的方法a(),其中方法a()是定义在接口中的,由类A来实现。这是一个双向调用的过程,用下面的类图来加以说明。 Callback.png 1. 创建一个接口: public interface CallBack{ publ

java+代码回调+编写_Java回调实现-爱代码爱编程

Java回调实现 什么是回调 回调核心思想 案例代码实现 后序 一、什么是回调 开发过程当中存在某种特殊的业务需求,例如: 回调生活实例.PNG 描述: 老板给员工下达了工作任务之后,就去做其他事情了。(此时此 刻,老板不知道需要多长时间完成,不会一直等着,而是做自己其他事情) 员工接收到任务之后,按照要求完成任务 当员工任务

Android接口回调(笔记-爱代码爱编程

Android接口回调讲解 回调定义回调机制回调意义接口回调的实现步骤参考 网上看了一堆,感觉有点零散,我自己总结一下。 回调定义 正式定义 回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,就说这是回调函数。回调函数不是由该函数的实现方直接调

[Java]什么是接口回调?-爱代码爱编程

什么是接口回调? 1.接口回调是什么[2]? 接口回调是指:可以把使用某一接口的类创建的对象的引用赋给该接口声明的接口变量,那么该接口变量就可以调用被类实现的接口的方法。实际上,当接口变量调用被类实现的接口中的方法时,就是通知相应的对象调用接口的方法,这一过程称为对象功能的接口回调。看下面示例。 interface People{    void

接口回调与方法回调-爱代码爱编程

1.1 接口回调 简介: 笔者查阅了大量资料,接口回调没有定义,可以理解为是一种设计思想。 什么是方法回调? 是将功能定义与功能分开的一种手段,一种解耦合的设计思想; 在Java中回调是通过接口来实现的,。不同的用户调用同一种方法可以满足其对应的不用需求。 例子: 有狗,猫,鸟三种动物,需要调用一个名为Animal 接口的call()

java接口回调_cookei-a的博客-爱代码爱编程

一.产生接口回调的场景 在现实生活中,产生接口回调的场景很简单,比如我主动叫你帮我做一件事,然后你做完这件事之后会通知我,"通知我"这个动作就是接口回调的动作.接口回调重在理解思就好.再举个例子用于下面的代码演示,老师让学生做课堂练习,学生做完练习后并告诉老师. 二.什么是接口回调 在Java的层面简单的说一下接口回调:现有一个接口A,和它的实现类A1,

c进阶:指针(2),qsort函数,模拟实现冒泡算法-爱代码爱编程

目录 😼😸一.回调函数 🐯1.回调函数的定义 🦁函数指针作为某个函数的参数 🐼2.来自知乎作者常溪玲的解说 🐋🦖二.qsort函数 🐰🦝 三.模拟实现冒泡算法 🐅1.什么是冒泡排序 🐆冒泡排序 🦄2.模拟实现冒泡算法 一.回调函数 要想理解回调函数,就要先知道什么是函数指针,函数指针详见:http://t.csdn.cn/o