zoukankan      html  css  js  c++  java
  • 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() {

    @Overridepublic void onClick(View v) {

      mActivity.startActivity(new Intent(mActivity, MainActivity.class));

    }});
  • 相关阅读:
    剑指 Offer 26. 树的子结构
    99. 恢复二叉搜索树(困难)
    93. 复原IP地址
    剑指 Offer 20. 表示数值的字符串
    100. 相同的树
    336. 回文对
    12. 整数转罗马数字(贪心!)
    块链技术在数据中心应用的成与败
    新型大脑启发式学习方法来了,可帮助人工神经网络节省内存和能量
    混合多云为何具有技术优势
  • 原文地址:https://www.cnblogs.com/zhchoutai/p/8321177.html
Copyright © 2011-2022 走看看