-
2020-01-03 13:48:30
回调的含义和用途
什么是回调?
一般来说,模块之间都存在一定的调用关系,从调用方式上看,可以分为三类:同步调用、异步调用和回调。同步调用是一种阻塞式调用,即在函数A的函数体里通过书写函数B的函数名来调用之,使内存中对应函数B的代码得以执行。异步调用是一种类似消息或事件的机制解决了同步阻塞的问题,例如 A通知 B后,他们各走各的路,互不影响,不用像同步调用那样, A通知 B后,非得等到 B走完后, A才继续走 。回调是一种双向的调用模式,也就是说,被调用的接口被调用时也会调用对方的接口,例如A要调用B,B在执行完又要调用A。
回调的用处
回调一般用于层间协作,上层将本层函数安装在下层,这个函数就是回调,而下层在一定条件下触发回调。例如作为一个驱动,是一个底层,他在收到一个数据时,除了完成本层的处理工作外,还将进行回调,将这个数据交给上层应用层来做进一步处理,这在分层的数据通信中很普遍。
Java中接口回调机制
java接口回调机制想必大家并不陌生,其思想简单,应用广泛,如网络请求、界面的点击监听等,是一个java开发者必须要掌握的基本思想之一。
我们在做java开发时经常会遇到文件下载、请求服务器数据等基本操作,大家都知道网络请求属于耗时操作,我们如果在直接主线程执行这些逻辑时很可能会造成主线程堵塞,从而导致程序崩溃。我们通常都是开启一个子线程来执行网络请求操作。
public void doSomeWork() { new Thread(new Runnable() { @Override public void run() { // 执行逻辑,发起网络请求,如请求后台数据,下载文件等 } }).start(); }
上面这段代码想必你已经再熟悉不过了,不过当我们在做一次开发时,经常会多次使用网络请求,比如多次请求服务器的数据,所以我们更愿意将其写成一个小框架:
public String doRequest(String url) { new Thread(new Runnable() { @Override public void run() { // 执行逻辑,请求后台json数据 } }).start(); //将获取的数据转化为String,并返回 }
那么问题来了: 我们在写成框架时,网络请求是在子线程中进行的,很可能数据还没返回来的时候,doRequest方法就已经执行完了(不懂的就需要去看看守护线程哦),那么这时候返回的数据就没有任何意义了,最终的结果是我们得到的String为空的,而不是我们期待的的数据。
解决此问题的一种方法: 子线程请求到数据后,直接对数据进行处理(缺陷:失去了框架的意义)
public void doRequestAndDealData(String url) { new Thread(new Runnable() { @Override public void run() { // 执行逻辑,请求后台json数据 // 直接对获取到的数据进行处理 } }).start(); }
对比上一段代码,我们这里直接对返回的数据进行了处理,而没有在方法里返回数据,但是这样的处理逻辑就是唯一的了,并不能随着请求的url不同而执行不同的处理逻辑,那么有没有一种方法能将在子线程中获取到的数据"传出去",使其能得到成功的处理呢? 这就是接口回调的巧妙之处了!
-
先定义一个接口
public abstract class CallBackListener { public abstract void onFinish() public abstract void onError(Exception ex); }
-
在类A中通过在子线程发起网络请求,并将接口作为参数,写到类A中!
public class A { public void doRequest(String url,CallBackListener backListener) { new Thread(new Runnable() { @Override public void run() { try { // 执行逻辑,发起网络请求,如请求后台数据,下载文件等 backListener.onFinish(); } catch (Exception ex) { backListener.onError(ex); } } }).start(); } }
-
在类B中调用类A的对象,发起请求,并且对请求得到的数据进行处理。
public class B { public void deal() { A a = new A(); a.doRequest("http://请求的url",new CallBackListener() { @Override public void onFinish() { //请求成功的逻辑,如下载完成后的处理,请求到数据后的处理 } @Override public void onError(Exception ex) { // 异常逻辑 } }); } }
我们在B中调用A的方法时,重写了接口中的方法,当发起的网络请求完成时,就会调用我们重写后的方法,这就是接口回调,这样根据需要来进行不同的重写,同样保留了框架的意义。
我们在下载完成后,界面的点击事件监听,后台数据请求完成时...还有很多地方都可以用到接口回调,掌握其思想后,我们也可以写的更加规范一点了,如将A类中的接口作参数就写为单的一个方法,setListener(CallBackListener listener);
更多相关内容 -
-
java接口回调
2017-03-23 00:18:43http://blog.csdn.net/IT_XF/article/details/65058367 -
Java接口回调机制
2020-12-22 20:16:42近在看androidFragment与Activity进行数据传递的部分,看到了接口回调的内容,来总结一下。 二、回调的含义和用途 1、什么是回调? 一般来说,模块之间都存在一定的调用关系,从调用方式上看,可以分为... -
java 接口回调实例详解
2020-08-29 22:51:59主要介绍了java 接口回调实例详解的相关资料,所谓回调就是使用java中的多态,需要的朋友可以参考下 -
Java中的接口回调
2021-01-20 03:42:48接口回调是多态的另一种体现。接口回调是指:可以把使用某一个接口的类创建的对象的引用赋给该接口声明的接口变量中,那么该接口变量可以调用被类实现的接口中的方法。当接口变量调用被类实现的接口中的方法时,是... -
Java接口回调一般用法
2020-12-22 15:58:49Java接口回调一般用法:实现接口实际上和继承抽象类类似,只不过继承是在类的层面上操作,接口是在方法和常量集合的层面上操作,接口比抽象类更抽象、更简洁。可以把实现接口看成继承特定的一个或多个方法以及一些... -
Java中的接口回调实例
2020-08-26 09:36:37今天小编就为大家分享一篇关于Java中的接口回调实例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧 -
java的接口回调示例代码
2016-12-31 18:20:37比如说讯飞的语音识别,我们调用它的识别方法之后不是马上就可以得到识别的结果,需要经过一段时间(网络传输耗时),但是我们不会让程序傻逼地等待它的返回结果,而是让classA实现它定义的接口IntefaceC,当讯飞的... -
深入了解Java接口回调机制
2020-08-26 00:12:22主要介绍了Java接口回调机制,下面我们来一起学习一下吧 -
Java接口回调详解
2018-08-29 16:15:33一.产生接口回调的场景 在现实生活中,产生接口回调的场景很简单,比如我主动叫你帮我做一件事,然后你做完这...在Java的层面简单的说一下接口回调:现有一个接口A,和它的实现类A1,和另外一个有接口A引用的类B,因为类B...一.产生接口回调的场景
在现实生活中,产生接口回调的场景很简单,比如我主动叫你帮我做一件事,然后你做完这件事之后会通知我,"通知我"这个动作就是接口回调的动作.接口回调重在理解思就好.再举个例子用于下面的代码演示,老师让学生做课堂练习,学生做完练习后并告诉老师.
二.什么是接口回调
在Java的层面简单的说一下接口回调:现有一个接口A,和它的实现类A1,和另外一个有接口A引用的类B,因为类B中有接口A的引用,在B执行完方法后,可以通过接口A的引用,告诉A执行完成了这个方法.由于A是一个接口,所以具体接收执行完成这个方法在它是实现类A1中体现.
三.在代码中的使用
以上面老师叫学生做课堂作业为例,我们先创建一个回调接口,以及用于接收学生做完课堂作业的消息
public interface BackInterface { void backMethod(); }
然后定义一个实现类Teacher,功能是让学生做课堂练习,接收学生做完课堂练习的通知
public class Teacher implements BackInterface { //因为老师要告诉学生做课堂练习,所以这个传一个学生的引用 private Student student; public Teacher(Student student){ this.student = student; } //老师告诉学生做课堂练习 public void doEvent(){ System.out.println("老师让学生做练习..."); student.doPractice(this); } //用于接收接口回调的消息 @Override public void backMethod() { System.out.println("老师接收到学生做完课堂练习的消息"); } }
学生类,功能是做练习,做完之后并告诉老师(回调)
public class Student { //学生做课堂练习,并告诉老师 public void doPractice(BackInterface BackInterface) { System.out.println("学生做练习..."); System.out.println("学生告诉老师做完练习..."); BackInterface.backMethod(); } }
进行测试:
public class BackDemo { public static void main(String[] args) { Teacher teacher = new Teacher(new Student()); teacher.doEvent(); } }
结果:
我们可以看到回调完成.在实际开发过程中为了保证效率我们往往发布任务的时候会做成异步的,在本例中就是把 "老师让学生做课堂练习" 做成异步,具体实现很简单,就是新建一个线程就可以了,也就是把Teacher类中的 "student.doPractice(this);"代码改成下面的代码:
new Thread(new Runnable() { @Override public void run() { } }).start();
还有就是为了代码的简洁,我们常常把Teacher类写成匿名内部类的形式,代码就不演示了
为了方便理解给几个参考地址:
https://blog.csdn.net/bfboys/article/details/52640587
https://blog.csdn.net/jonsnoww/article/details/68932292 -
理解Java接口回调
2019-02-28 13:08:272、创建一个回调对象实现回调接口。 3、创建一个控制器对象,将回调对象作为参数传给控制器对象,控制器对象负责检查某个场景是否出现或某个条件是否满足,当满足时,则调用回调对象的某方法。 代码示例: 实例:...初步认识:
实现步骤:
1、创建一个回调接口。
2、创建一个回调对象实现回调接口。
3、创建一个控制器对象,将回调对象作为参数传给控制器对象,控制器对象负责检查某个场景是否出现或某个条件是否满足,当满足时,则调用回调对象的某方法。
代码示例:
实例:Boss通知员工做事情,员工完成任务之后告诉Boss完成情况。
说明:Callback:回调接口。Boss:回调对象。Employee:控制器对象。
1、创建一个回调接口
public interface Callback { public void yes(); public void no(); }
2、创建一个回调对象实现回调接口
// Boss需要实现回调的接口 public class Boss implements Callback{ // 传入一个员工对象 private Employee employee; public Boss(Employee employee) { this.employee = employee; } // 告诉员工要做什么事情 public void doEvent(String event) { System.out.println("Boss:"+event); // 将当前对象传给员工,员工才可以回调 employee.doSomething(this, event); } // 员工完成事情后回调的方法 @Override public void yes() { System.out.println("Boss:任务完成得很不错,下个月给你涨工资"); } @Override public void no() { System.out.println("Boss:任务没完成,好好反思一下"); } }
3、创建一个控制器对象,将回调对象作为参数传给控制器对象,控制器对象负责检查某个场景是否出现或某个条件是否满足,当满足时,则调用回调对象的某方法
public class Employee { public Employee(){} // 完成boss交代的事情,回调接口作为参数穿过来 public void doSomething(Callback callback, String event) { String flag=null; System.out.println("Employee:正在做:"+event); // 根据完成情况通知Boss,即接口回调 System.out.println("Employee:完成了任务!"); flag="完成"; if(flag.equals("完成")){ callback.yes(); } System.out.println("Employee:未完成任务!"); flag="未完成"; if(flag.equals("未完成")){ callback.no(); } } }
4、测试:
public class Test { public static void main(String[] args) { Employee employee=new Employee(); Boss boss = new Boss(employee); boss.doEvent("写hello world!"); } }
结果:
-
Java编程接口回调一般用法代码解析
2020-08-29 09:48:21本文的主要内容是同过实际代码向大家展示Java编程中接口回调的一般用法,具有一定参考价值,需要的朋友可以了解下 -
java接口回调实例
2018-05-09 22:41:58Java Interface ——接口回调解析及实例通常的认知中java的接口就是用来定义一两个功能函数,其实现类来重写实现这些方法,今天给大家介绍一种很受欢迎且有很大益处的使用方法——接口回调...Java Interface ——接口回调解析及实例
通常的认知中java的接口就是用来定义一两个功能函数,其实现类来重写实现这些方法,今天给大家介绍一种很受欢迎且有很大益处的使用方法——接口回调(在Android中大量使用)
互不相识的Tom和Jack,在一次偶然的情况下相遇,Tom觉得Jack很有基情,于是想询问他的名字,并且非常渴望得到他的回应。
-Tom:Hi ! What's name ?
-Jack: I'm Jack!
一个很有基情的小伙子一般都会有这种想法,于是我把这种行为定义为一个接口,使每个有基情的小伙子都会有这种行为。
DemoInter接口
public interface DemoInter { //inquiry one's name abstract void name(String string); }
Tom类(实现接口)
public class Tom implements DemoInter{ @Override public void name(String string) { System.out.println(string); } public void inquiry(){ System.out.println("Hi ! What's your name ?"); } }
Jack类
Jack类里面定义了一个back(回执)的方法,该方法的参数是DemoInter类型,即所有DemoInter的实现类都可以当参数传递进来。而DenoInter接口定义了一个抽象方法name(String string),在back()方法里面调用传递进来的DemoInter实例的name()方法。
在Tom类编写main()方法public class Jack { public void back(DemoInter demoInter){ demoInter.name("Hello ! I'm Jack"); } }
运行结果:public class Tom implements DemoInter{ @Override public void name(String string) { System.out.println(string); } public void inquiry(){ System.out.println("Hi ! What's your name ?"); } public static void main(String[] args) { Tom tom=new Tom(); Jack jack=new Jack(); tom.inquiry(); jack.back(tom); } }
通过以上的小栗子可以看到,接口回调就是,把某接口的实现类的实例当作变量传递给某个以此接口为形参的函数,利用此参数回调此接口的方法,这就是接口回调。
-
深度解析java接口回调机制
2016-11-14 15:47:17一、系统源码分析 ...public class CompoundButton { /** * 接口回调四步走战略:1.定义一个接口(接口中当然要包括方法) * 2.定义一个接口变量 * 3.设置一个接口监听 * 4.在满足某一条件下接口变 -
N个例子让你彻底理解java接口回调
2017-03-23 00:17:20说到接口回调,对于初学者来说,理解是真的难啊,不过没有关系,看完本篇文章,你马上就能理解接口回调啦!概念什么是接口回调?用我的理解,就是:A让B去做一件耗时的操作,而且并不知道要花费多少时间,B做完了后... -
Java利用接口实现回调
2021-01-20 03:49:26在Java支持方法指针之前,Java接口不能提供一种实现回调的好方法。如果您习惯于传递在事件驱动编程模型中调用的函数指针,则您会喜欢本技巧。 熟悉MS-Windows和X Window System事件驱动编程模型的开发人员,习惯... -
大话 java android 接口回调 全面解析点击事件 大量举例
2022-03-31 08:03:51越努力,越幸运! 梦想终会一步一步实现。 阅读本文,收获什么: 1.理解什么是接口回调 ...4.应用接口回调在真实需求中- a....`一、Java(Android)的接口回调是什么?1.套用正规说法2.大话,举例翻译. -
JNI调用及回调就(Java&C) 源码
2019-03-10 11:30:33Java通过JNI方式调用别人写的DLL,并涉及到DLL C代码回调Java程序,并传递二进制参数回来。业务:java控制摄像头,摄像头抓拍到图片后,传字节流给java,Java做存储 -
Java 接口回调机制
2017-05-26 21:05:32日常开发中接口回调机制无处不在,刚开开始用时却总是晕晕乎乎,网上也有很多相关的文章介绍,但总是没有看得太明白,今天特意花时间来总结一下 一、什么是接口回调 在应用开发中,接口回调机制是一种常用的设计... -
java 接口回调经典案例--网络请求回调
2015-10-23 01:54:28在这个例子里,你的电话号码就叫回调函数,你把电话留给店员就叫登记回调函数,店里后来有货了叫做触发了回调关联的事件,店员给你打电话叫做调用回调函数,你到店里去取货叫做响应回调事件。(来自知乎)回调的好处... -
Java之接口与回调
2019-01-11 12:44:53前言 回调是一种常见的程序设计模式,利用回调技术可以处理这样的问题,事件A发生时要执行处理事件A的代码,判断何时发生事件A及何时执行处理... Java中Swing与AWT的事件监听处理模型就是使用接口与回调实现的... -
java实现接口回调数据
2017-09-05 08:45:47求教各位大神, 如何写接口给别人调用 。 最后保存别人返回的数据 -
java接口回调跟造型问题
2014-11-26 14:33:41class A {} final class B {} interface C {} B b = (B)new A(); C c1 = (C) new A(); C c2 = (C)new B(); 为什么B b = (B)new A(),C c2 =(C)new B()会出现编译错误?而C c1=(C)new A()却不报错?...在线求解 -
java 回调函数 实现
2013-07-24 09:58:44java 回调函数 自己模拟实现 使用了接口来完成 -
Java同步回调函数
2020-12-22 17:15:40软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用、回调和异步调用。 同步调用:一种阻塞式调用,调用方要等待对方执行完毕才返回,它是一种单向调用; 回调:一种双向调用... -
Java回调接口设计&&Lambda改造
2019-05-08 10:32:42Java回调接口设计&&Lambda改造 设计之初 作为一名有技术情怀的程序员,在日常开发中,我们会遇到多种多样的场景,比如说在代码执行完成后进行的同步操作,亦或者是在代码执行过程中发生的异步操作,如果...