一个经典例子让你彻彻底底理解java回调机制

来源:互联网 发布:虚拟主机控制面板源码 编辑:程序博客网 时间:2024/06/06 02:22

以前不理解什么叫回调,天天听人家说加一个回调方法啥的,心里想我草,什么叫回调方法啊?然后自己就在网上找啊找啊找,找了很多也不是很明白,现在知道了,所谓回调:就是A类中调用B类中的某个方法C,然后B类中反过来调用A类中的方法D,D这个方法就叫回调方法,这样子说你是不是有点晕晕的,其实我刚开始也是这样不理解,看了人家说比较经典的回调方式:

  • Class A实现接口CallBack callback——背景1
  • class A中包含一个class B的引用b ——背景2
  • class B有一个参数为callback的方法f(CallBack callback) ——背景3
  • A的对象a调用B的方法 f(CallBack callback) ——A类调用B类的某个方法 C
  • 然后b就可以在f(CallBack callback)方法中调用A的方法 ——B类调用A类的某个方法D

大家都喜欢用打电话的例子,好吧,为了跟上时代,我也用这个例子好了,我这个例子采用异步加回调

有一天小王遇到一个很难的问题,问题是“1 + 1 = ?”,就打电话问小李,小李一下子也不知道,就跟小王说,等我办完手上的事情,就去想想答案,小王也不会傻傻的拿着电话去等小李的答案吧,于是小王就对小李说,我还要去逛街,你知道了答案就打我电话告诉我,于是挂了电话,自己办自己的事情,过了一个小时,小李打了小王的电话,告诉他答案是2

/**  * 这是一个回调接口  * @author xiaanming  *  */  public interface CallBack {      /**      * 这个是小李知道答案时要调用的函数告诉小王,也就是回调函数      * @param result 是答案      */      public void solve(String result);  }  

————————————————————————————————

/**  * 这个是小王  * @author xiaanming  * 实现了一个回调接口CallBack,相当于----->背景一  */  public class Wang implements CallBack {      /**      * 小李对象的引用      * 相当于----->背景二      */      private Li li;         /**      * 小王的构造方法,持有小李的引用      * @param li      */      public Wang(Li li){          this.li = li;      }            /**      * 小王通过这个方法去问小李的问题      * @param question  就是小王要问的问题,1 + 1 = ?      */      public void askQuestion(final String question){          //这里用一个线程就是异步,          new Thread(new Runnable() {              @Override              public void run() {                  /**                  * 小王调用小李中的方法,在这里注册回调接口                  * 这就相当于A类调用B的方法C                  */                  li.executeMessage(Wang.this, question);               }          }).start();                    //小网问完问题挂掉电话就去干其他的事情了,诳街去了          play();      }        public void play(){          System.out.println("我要逛街去了");      }        /**      * 小李知道答案后调用此方法告诉小王,就是所谓的小王的回调方法      */      @Override      public void solve(String result) {          System.out.println("小李告诉小王的答案是--->" + result);      }        }  
——————————————————————————————

/**  * 这个就是小李啦  * @author xiaanming  *  */  public class Li {      /**      * 相当于B类有参数为CallBack callBack的f()---->背景三      * @param callBack        * @param question  小王问的问题      */      public void executeMessage(CallBack callBack, String question){          System.out.println("小王问的问题--->" + question);                    //模拟小李办自己的事情需要很长时间          for(int i=0; i<10000;i++){                        }                    /**          * 小李办完自己的事情之后想到了答案是2          */          String result = "答案是2";                    /**          * 于是就打电话告诉小王,调用小王中的方法          * 这就相当于B类反过来调用A的方法D          */          callBack.solve(result);                             }        }  
————————————————————————————————
/**  * 测试类  * @author xiaanming  *  */  public class Test {      public static void main(String[]args){          /**          * new 一个小李          */          Li li = new Li();            /**          * new 一个小王          */          Wang wang = new Wang(li);                    /**          * 小王问小李问题          */          wang.askQuestion("1 + 1 = ?");      }  }  





转帖请注明本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/17483273),请尊重他人的辛勤劳动成果,谢谢

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 孕妇吃了糟卤怎么办 气泡机打不了气怎么办 膝盖好冷好凉怎么办吃什么好 卸妆水进眼睛了怎么办 外出没带卸妆水怎么办? 种睫毛卸睫膏弄眼睛里面了 怎么办 化了妆没卸妆水怎么办 痘痘变成了黑痣怎么办 痘痘形成的痣怎么办 图片文件重命名改不了怎么办 想给宝宝改名字怎么办 洗照片像素过低怎么办 用ps改尺寸照片变形怎么办 平安银行卡三次密码错误怎么办 平安银行卡密码忘了怎么办 平安银行行用卡多次还款怎么办 平安银行大润发卡还不上怎么办 八载图片被投诉怎么办 ps用替换颜色后怎么办 三星s8百度闪退怎么办 吃了过敏的东西怎么办 过敏了痒的厉害怎么办 脸吃麻辣过敏了怎么办 脸过敏发红痒怎么办急救 脸过敏怎么办快速治疗方法 下巴起噶的过敏怎么办 药物过敏脸肿了怎么办 吃虾过敏全身痒怎么办 全身过敏怎么办 痒的厉害 吃小龙虾过敏全身痒怎么办 脸过敏肿起来了怎么办 小孩对灰尘树木过敏怎么办 小孩过敏怎么办痒的很 脸皮肤过敏很痒怎么办 浅粉色绵羊皮衣不好清洗怎么办 皮料染上其他颜色怎么办 宝宝的银锁发黑怎么办 pu鞋子蹭坏了怎么办 包的油边脱胶了怎么办 pu包有点破皮怎么办 买房子不给过户怎么办