开发文章

java回调函数的理解

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

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

那么从现在开始可以先用我的三要素来理解,之前的可以暂时忘记.
回调我这边总结了有三要素:

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

销售卖机器的例子

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

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

我们先缕一缕思路:
在这个需求里,我们用刚刚的三要素定位下.

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

我们来看看下面的代码:
工人类需要对生产机器的进去进行监听.

复制内容到剪贴板
  1. /** 
  2.  * 工人类 
  3.  * 1. 只要负责生产 
  4.  * 2. 生产完之后告诉经理 
  5.  * @author relicemxd 
  6.  * 
  7.  */  
  8. public class Worker {  
  9.     private WorkListner listner;  
  10.   
  11.   /** 
  12.      * 制造机器: 
  13.      * 工人特有的方法 
  14.      */  
  15.     public void makeMachine() {  
  16.         int num = 100;  
  17.         for (int i = 0; i < num; i++) {  
  18.             if (num >= 50) {  
  19.                 continue;  
  20.             }  
  21.         }  
  22.         // 满足100台机器,通知可以进行下一步操作  
  23.         listner.onWorkListner(num);  
  24.     }  
  25.   
  26.     /* 
  27.      * 监听工人生产情况的接口 
  28.      */  
  29.     public interface WorkListner {  
  30.         //对满足条件后,进行事件操作的方法  
  31.         void onWorkListner(int num);  
  32.     }  
  33.   
  34.     /** 
  35.      * 设置监听工人生产情况的方法 
  36.      * @param listner  接扣要在需求方被实现 
  37.      */  
  38.     public void setOnWorkListner(WorkListner listner) {  
  39.         this.listner = listner;  
  40.     }  
  41. }  

 

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

再继续看下面代码:
销售需要设置监听,才知道工人几时才生产完机器.

复制内容到剪贴板
  1. /** 
  2.  * 销售只要负责卖就可以了 
  3.  *  
  4.  * @author relicemxd 
  5.  * 
  6.  */  
  7. public class Seller {  
  8.     public static void main(String[] args) {  
  9.         //1. 销售要卖机器首先要有机器,谁生产机器?  找到工人  
  10.         Worker work = new Worker();  
  11.   
  12.         //2. 销售要卖多少台机器?  告诉工人  
  13.         work.setOnWorkListner(new WorkListner() {  
  14.             @Override  
  15.             public void onWorkListner(int num) {  
  16.                 System.out.println("现在已经生产完成,共 "+num +" 台机器");  
  17.   
  18.                 //当工人生产完成后就可以卖机器了  
  19.                 sell();  
  20.             }  
  21.         });  
  22.   
  23.         //3. 工人明确要生产多少台机器后就可以开干了.   让工人生产100台机器  
  24.         work.makeMachine();  
  25.     }  
  26.   
  27.   
  28.     /** 
  29.      * 卖机器: 
  30.      * 只有销售才有的方法 
  31.      */  
  32.     private static void sell() {  
  33.         System.out.println("销售开始卖机器给老外了...");  
  34.     }  
  35. }  

 

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

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

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

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

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

  • 接口: Button
    在源码中可以看到,设置监听的方法写在Button里类,而OnClickListener写在Button的父类View里.
复制内容到剪贴板
  1. public void setOnClickListener(@Nullable OnClickListener l) {
  
  2.   if (!isClickable()) {
  
  3.      setClickable(true);
  
  4.   }
  
  5.   getListenerInfo().mOnClickListener = l;
  
  6. }  

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

复制内容到剪贴板
  1. button.setOnClickListener(new OnClickListener() {
  
  2. @Override
  
  3. public void onClick(View v) {
  
  4.   mActivity.startActivity(new Intent(mActivity, MainActivity.class));
  
  5. }});  

 

 

感谢 林锐波 支持 磐实编程网 原文地址:
blog.csdn.net/relicemxd/article/details/59144352

文章信息

发布时间:2017-03-03

作者:林锐波

发布者:aquwcw

浏览次数: