精华内容
下载资源
问答
  • Java接口回调
    千次阅读
    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接口回调机制

    2020-12-22 20:16:42
     近在看androidFragmentActivity进行数据传递的部分,看到了接口回调的内容,来总结一下。  二、回调的含义和用途  1、什么是回调?  一般来说,模块之间都存在一定的调用关系,从调用方式上看,可以分为...
  • Java中的接口回调实例

    2020-08-26 09:36:37
    今天小编就为大家分享一篇关于Java中的接口回调实例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
  • java接口回调

    2017-03-23 00:18:43
    http://blog.csdn.net/IT_XF/article/details/65058367
  • Java利用接口实现回调

    2021-01-20 03:49:26
    在Java支持方法指针之前,Java接口不能提供一种实现回调的好方法。如果您习惯于传递在事件驱动编程模型中调用的函数指针,则您会喜欢本技巧。  熟悉MS-Windows和X Window System事件驱动编程模型的开发人员,习惯...
  • 比如说讯飞的语音识别,我们调用它的识别方法之后不是马上就可以得到识别的结果,需要经过一段时间(网络传输耗时),但是我们不会让程序傻逼地等待它的返回结果,而是让classA实现它定义的接口IntefaceC,当讯飞的...
  • 本文的主要内容是同过实际代码向大家展示Java编程中接口回调的一般用法,具有一定参考价值,需要的朋友可以了解下
  • Java中的接口回调

    2021-01-20 03:42:48
    接口回调是多态的另一种体现。接口回调是指:可以把使用某一个接口的类创建的对象的引用赋给该接口声明的接口变量中,那么该接口变量可以调用被类实现的接口中的方法。当接口变量调用被类实现的接口中的方法时,是...
  • 主要介绍了java 接口回调实例详解的相关资料,所谓回调就是使用java中的多态,需要的朋友可以参考下
  • Java接口与回调

    千次阅读 2019-01-11 12:44:53
    前言  回调是一种常见的程序设计模式,利用回调技术可以处理这样的问题,事件A发生时要执行处理事件A的代码,判断何时发生事件A及何时执行处理... Java中SwingAWT的事件监听处理模型就是使用接口与回调实现的...
    • 前言

           回调是一种常见的程序设计模式,利用回调技术可以处理这样的问题,事件A发生时要执行处理事件A的代码,判断何时发生事件A及何时执行处理事件A的代码。这些代码是固定的,先行编写完毕,供使用。但事件A的处理代码开放给其他开发人员编写,可以有很多不同的实现,使用时可以注册具体需要的实现来处理。


           Java中Swing与AWT的事件监听处理模型就是使用接口与回调实现的,后面学习Applet之后会进一步体会接口与回调的好处,这里举一个简单的例子:

    package cahpter05;
    //MyListener为事件处理接口,其中有specialProcessEvent方法,表示处理事件的方法
    interface MyListener
    {
    	void specialProcessEvent();
    }
    
    class Mymoniter
    {
    	MyListener mylistener;
    	//注册监听器方法
    	public void regListener(MyListener ml)
    	{
    		this.mylistener=ml;
    	}
    	//事件处理方法
    	public void generalProcessEvent()
    	{
    		this.mylistener.specialProcessEvent();
    	}
    }
    //方式A实现MyListener接口
    class WayA implements MyListener
    {
    	public void specialProcessEvent()
    	{
    		System.out.println("采用A方式处理事件!");
    	}
    }
    //方式B实现MyListener接口
    class WayB implements MyListener
    {
    	public void specialProcessEvent()
    	{
    		System.out.println("采用B方式处理事件!");
    	}
    }
    public class Sample5_2 
    {
    	public static void main(String[] args) 
    	{
    		// TODO Auto-generated method stub
    		Mymoniter mm= new Mymoniter();
    		
    		WayA wa=new WayA();
    		WayB wb=new WayB();
    		//注册A处理器
    		mm.regListener(wa);
    		//发送事件处理请求
    		mm.generalProcessEvent();
    		//注册B处理器
    		mm.regListener(wb);
    		//发送事件处理请求
    		mm.generalProcessEvent();
    	}
    }
    

           在上面的的例子中,MyMoniter是一个监控者,当有事件发生时,通知监控类(调用某generalProcessEvent方法)处理事件,而eneralProcessEvent方法调用注册到监控器的处理器中的specialProcessEvent方法来对具体事件处理。

           MyMointer中regListener方法允许把不同处理器注册给监控者。Way与WayB是实现了事件处理接口的两个具体的处理器,分别对事件采用不同的处理方法。

           由于两次事件处理前注册了不同的处理器实现,故两次事件处理执行的任务不同。而且如果有需要,可以实现更多不同的处理方式,提高了很高的灵活性。

    展开全文
  • Java接口回调一般用法

    2020-12-22 15:58:49
    Java接口回调一般用法:实现接口实际上和继承抽象类类似,只不过继承是在类的层面上操作,接口是在方法和常量集合的层面上操作,接口比抽象类更抽象、更简洁。可以把实现接口看成继承特定的一个或多个方法以及一些...
  • 主要介绍了Java按时间梯度实现异步回调接口,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
  • Java同步回调函数

    2020-12-22 17:15:40
     软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用、回调和异步调用。  同步调用:一种阻塞式调用,调用方要等待对方执行完毕才返回,它是一种单向调用;  回调:一种双向调用...
  • 主要介绍了Java通过匿名类来实现回调函数的例子,回调函数就是一种函数签名(若干个输入参数、一个输出参数)的规范,java虽不存在函数声明,但是java可以用接口来强制规范。具体操作步骤大家可查看下文的详细讲解,...
  • 主要介绍了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:27
    2、创建一个回调对象实现回调接口。 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 是如何利用接口避免函数回调的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • java自定义回调函数

    2015-04-05 23:43:35
    java自定义回调函数代码,SDK开发.对后续编写自己的SDK有帮助!
  • 微信支付-商户支付模式一url接口回调-java版,代码清晰,可直接运行
  • Java接口异步调用

    2020-08-26 00:11:43
    主要介绍了Java接口异步调用,下面我们来一起学习一下吧
  • Java通过JNI方式调用别人写的DLL,并涉及到DLL C代码回调Java程序,并传递二进制参数回来。业务:java控制摄像头,摄像头抓拍到图片后,传字节流给javaJava做存储
  • 主要介绍了APP微信支付(java后台_统一下单和回调),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • 越努力,越幸运! 梦想终会一步一步实现。 阅读本文,收获什么: 1.理解什么是接口回调 ...4.应用接口回调在真实需求中- a....`一、Java(Android)的接口回调是什么?1.套用正规说法2.大话,举例翻译.
  • 主要介绍了浅谈Java中向上造型向下造型和接口回调中的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • java 回调函数 实现

    2013-07-24 09:58:44
    java 回调函数 自己模拟实现 使用了接口来完成
  • Java回调接口设计&&Lambda改造

    千次阅读 2019-05-08 10:32:42
    Java回调接口设计&&Lambda改造 设计之初 作为一名有技术情怀的程序员,在日常开发中,我们会遇到多种多样的场景,比如说在代码执行完成后进行的同步操作,亦或者是在代码执行过程中发生的异步操作,如果...
  • 一个实现回调方式的示例,简单来说回调方法的函数参数是接口,是方法
  • Java中的接口回调学习使用

    千次阅读 2019-02-08 15:55:05
    日常开发中接口回调机制无处不在,刚开始用时却一直很模糊,今天就认真的了解一波 我觉得一位大神博主(Bing_Hui )解释的很到位,博客传送们:https://blog.csdn.net/hbyh632/article/details/78592242  在应用...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 241,014
精华内容 96,405
关键字:

java接口与回调

java 订阅