java回调函数这样说,应该明白了吧!

有哥们问我回调怎么用,回调怎么理解?怎么说好呢,只可意会不可言传呐,非也,回调在实际开发中使用频率其实是很高的,恰好我小时候也被回调函数欺负过,竟然问了,那么肯定要好好分享一下我的一些经验.

网传回调的理解

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

估计看完已经晕在厕所了,可以暂时忽略…

那么从现在开始可以先用我的三要素来理解,之前的可以暂时忘记.

回调我这边总结了有三要素:

  1. 接口: 哪里需要被监听,接口就写在那里.
  2. 引用: 要有引用才可以对被监听者进行设置监听.
  3. 实现: 哪里需要数据/结果,就在那里进行实现

销售卖机器的例子

一个销售向工人订了100台机器准备卖给老外,让工人在生产完100台机器后通知下他.

对于这个需求我们可以用回调监听来处理

我们先缕一缕思路:

在这个需求里,我们用刚刚的三要素定位下.

  1. 哪里需要被监听 -> 工人 (监听工人工作进度)
  2. 哪里需要结果 -> 销售 (得到工人生产的结果)
  3. 对被监听者进行设置监听 -> 销售 (因为结果最终在销售类里获得,因此设置监听要在这里)

我们来看看下面的代码:

工人类需要对生产机器的进去进行监听.

/**
 * 工人类
 * 1. 只要负责生产
 * 2. 生产完之后告诉经理
 * @author relicemxd
 *
 */
public class Worker {
    private WorkListner listner;

  /**
     * 制造机器:
     * 工人特有的方法
     */
    public void makeMachine() {
        int num = 100;
        for (int i = 0; i < num; i++) {
            if (num >= 50) {
                continue;
            }
        }
        // 满足100台机器,通知可以进行下一步操作
        listner.onWorkListner(num);
    }

    /*
     * 监听工人生产情况的接口
     */
    public interface WorkListner {
        //对满足条件后,进行事件操作的方法
        void onWorkListner(int num);
    }

    /**
     * 设置监听工人生产情况的方法
     * @param listner  接扣要在需求方被实现
     */
    public void setOnWorkListner(WorkListner listner) {
        this.listner = listner;
    }
}

上面要对工人的工作情况进行观察,因此WorkListner接口和setOnWorkListner(WorkListner listner)设置监听的方法就写在Worker工人类.

再继续看下面代码:

销售需要设置监听,才知道工人几时才生产完机器.

/**
 * 销售只要负责卖就可以了
 *
 * @author relicemxd
 *
 */
public class Seller {
    public static void main(String[] args) {
        //1. 销售要卖机器首先要有机器,谁生产机器?  找到工人
        Worker work = new Worker();

        //2. 销售要卖多少台机器?  告诉工人
        work.setOnWorkListner(new WorkListner() {
            @Override
            public void onWorkListner(int num) {
                System.out.println("现在已经生产完成,共 "+num +" 台机器");

                //当工人生产完成后就可以卖机器了
                sell();
            }
        });

        //3. 工人明确要生产多少台机器后就可以开干了.   让工人生产100台机器
        work.makeMachine();
    }

    /**
     * 卖机器:
     * 只有销售才有的方法
     */
    private static void sell() {
        System.out.println("销售开始卖机器给老外了...");
    }
}

要想知道机器的进度情况,那么就肯定要有new Worker()工人对象,此时有了工人的引用,接着要什么需求就吩咐工人(做100台机器)并告之工人做完给反馈work.setOnWorkListner(listner),工人开始按需求做机器了work.makeMachine(),做完后就会进行反馈回调,告之销售可以拿去卖了onWorkListner(int num) { TODO }

如果还有疑惑的继续看android中的常见回调点击事件

我目前所见过的回调都是在一个特定的条件下才发生的方法回调(例如按钮的onClick();最常见)

我先分析下要做实事的是不是对应的activity/fragment或者adapter里,需要被监听观察是否有点击状态的是否就Button.

好我知道来来龙去脉后,用三要素苏通下:

  • 接口: Button

    在源码中可以看到,设置监听的方法写在Button里类,而OnClickListener写在Button的父类View里.

public void setOnClickListener(@Nullable OnClickListener l) {?
  if (!isClickable()) {?
     setClickable(true);?
  }?
  getListenerInfo().mOnClickListener = l;?
}
  • 实现和引用

    activity里,当点击了button后,我需要打开一个页面MainActivity,因此button的应用和setOnClickListener(listner)方法都写在了这个activity里.

button.setOnClickListener(new OnClickListener() {?
@Override?
public void onClick(View v) {?
  mActivity.startActivity(new Intent(mActivity, MainActivity.class));?
}});
时间: 2024-08-06 12:23:10

java回调函数这样说,应该明白了吧!的相关文章

Java回调函数详解

为了了解什么是回调函数,在网上查阅了如下资料,整理如下: 资料一: 首先说说什么叫回调函数? 在WINDOWS中,程序员想让系统DLL调用自己编写的一个方法,于是利用DLL当中回调函数(CALLBACK)的接口来编写程序,使它调用,这个就 称为回调.在调用接口时,需要严格的按照定义的参数和方法调用,并且需要处理函数的异步,否则会导致程序的崩溃. 这样的解释似乎还是比较难懂,这里举个简 单的例子: 程序员A写了一段程序(程序a),其中预留有回调函数接口,并封装好了该程序.程序员B要让a调用自己的程

一个简单的java回调函数的实现

回调函数 回调函数涉及的3个函数 登记回调函数 回调函数 响应回调函数 简单的解释 你到一个商店买东西,刚好你要的东西没有货,于是你在店员那里留下了你的电话,过了几天店里有货了,店员就打了你的电话,然后你接到电话后就到店里去取了货.在这个例子里,你的电话号码就叫回调函数,你把电话留给店员就叫登记回调函数,店里后来有货了叫做触发了回调关联的事件,店员给你打电话叫做调用回调函数,你到店里去取货叫做响应回调事件.回答完毕.来自知乎点击打开链接 代码的实现 首先有一个接口 interface CallB

java回调函数机制

Java回调函数机制 参考了网上的一些资料,下面也做出一些总结,供初学者了解学习. 一. 概述 软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用.回调.异步调用 . 同步调用:一种阻塞式调用,调用方要等待对方执行完毕才返回,它是一种单向调用: 回调:一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口: 异步调用:一种类似消息或事件的机制,解决了同步阻塞的问题,它的调用方向刚好相反,接口的服务在收到某种讯息或发生某种事件时,会主动通知客户方(即调用客户

Android(java)回调函数经典示例

回调函数经典示例 1.使用java回调函数来实现一个测试函数运行时间的工具类 public class TestObject { /** * 一个用来被测试的方法,进行了一个比较耗时的循环 */ public static void testMethod(){ for ( int i= 0 ; i< 100000000 ; i++){ } } /** * 一个简单的测试方法执行时间的方法 */ public void testTime(){ long begin = System.current

Java回调函数的理解与实现

回调函数,或简称回调,是指通过函数参数传递到其它代码的,某一块可执行代码的引用.这一设计允许了底层代码调用在高层定义的子程序. 在Java里面,我们使用接口来实现回调.举个例子 所谓的回调,就是程序员A写了一段程序(程序a),其中预留有回调函数接口,并封装好了该程序.程序员B要让a调用自己的程序b中的一个方法,于是,他通过a中的接口回调自己b中的方法. 举个例子: 1.  首先定义一个类Caller,按照上面的定义就是程序员A写的程序a,这个类里面保存一个接口引用. public class C

转Java 回调函数的理解

所谓回调,就是客户程序C调用服务程序S中的某个函数A,然后S又在某个时候反过来调用C中的某个函数B,对于C来说,这个B便叫做回调函数.例如Win32下的窗口过程函数就是一个典型的回调函数.一般说来,C不会自己调用B,C提供B的目的就是让S来调用它,而且是C不得不提供.由于S并不知道C提供的B姓甚名谁,所以S会约定B的接口规范(函数原型),然后由C提前通过S的一个函数R告诉S自己将要使用B函数,这个过程称为回调函数的注册,R称为注册函数.Web Service以及Java的RMI都用到回调机制,可

Java回调函数的理解

所谓回调,就是客户程序C调用服务程序S中的某个函数A,然后S又在某个时候反过来调用C中的某个函数B,对于C来说,这个B便叫做回调函数.例如Win32下的窗口过程函数就是一个典型的回调函数.一般说来,C不会自己调用B,C提供B的目的就是让S来调用它,而且是C不得不提供.由于S并不知道C提供的B姓甚名谁,所以S会约定B的接口规范(函数原型),然后由C提前通过S的一个函数R告诉S自己将要使用B函数,这个过程称为回调函数的注册,R称为注册函数.Web Service以及Java的RMI都用到回调机制,可

Java 回调函数

回调函数 我对回调函数的理解 假设: 我的车在家里,现在已经坏了,我打电话给万能的维修工,我告诉他,嘿!哥来帮我修一下我的车吧!但是,维修工告诉我没有现在空闲,等有空闲了我可以上门服务!我告诉维修工如果你有空了那么你就直接来我家给我修理吧. 换成程序而言: 如果我想让一个类,调用我自己声明的方法,那么我需要一个一个回调接口来让我自己的类去实现它.通过这样来实现回调函数.回调函数就好像是C#中的委托.Java中并没有类似的机制.可以利用接口来实现回调. 下面是一个小的Demo: 下面是一个简单的类

了解java回调函数

在计算机程序设计中,回调函数,或简称回调(Callback 即call then back 被主函数调用运算后会返回主函数),是指通过函数参数传递到其它代码的,某一块可执行代码的引用.这一设计允许了底层代码调用在高层定义的子程序.(维基百科) C的回调 在C/C++中,回调函数是一个通过函数指针调用的函数,当你把函数的指针作为参数传递给另外一个函数.当这个指针被用来调用其所指向的函数时,我们称这样的函数为回调函数. 实用情况举例: 1. 假设要编写一个库,其中提供了某些排序算法.(如冒泡排序,快