笔记84--回调机制详解---转自爱哥

来源:互联网 发布:网信理财软件 编辑:程序博客网 时间:2024/04/30 20:23

原文链接:http://blog.csdn.net/aigestudio/article/details/40869893#comments

///////////////////////////////////////////////////////////////////////////////复习此段即可

数据的流向大致是Manager—–>Personnel—–>Manager,这不就是一个“回调”的过程么?现在我们来总结下满足回调的两个基本条件:

1.Class A调用Class B中的X方法

2.ClassB中X方法执行的过程中调用Class A中的Y方法完成回调

假设总经理出差前交了件事情给我去办,不巧……副总经理也要给我件事去办,更无耻的是……主管也发任务过来了,都要求说做完就打电话通知他们……这时我们就要定义更多类,什么总经理类啦~经理类啦~主管类啦~杂七杂八的类,但是这些杂七杂八的大爷们都要求做完事情就电话通知,每个类都会有一个类似phoneCall的方法作为回调方法,这时,我们利用面向对象的思想来看~是不是可以把这个回调方法抽象出来作为一个独立的抽象类或接口呢?多态的思想油然而生~~~鉴于JAVA接口的好处,我们就定义一个名为CallBack的接口作为回调接口,再在该接口下定义一个名为backResult的抽象方法作为回调方法,让那些总经理类啦~经理类啦~主管类啦~什么的都去实现该接口。

/////////////////////////////////////////////////////////////////////////////

当时我思考了下就让他在异步完成后回调一下将值返回……因为对方是初学者我就给他简单解释了下Android的回调……说了一下午他都没弄明白……原因不是我讲得不够详细而是他陷进了他异步的问题……他把他那个问题和我讲的回调混在了一起……一直跳不出那个思维,其实回调机制很好理解,也基于这个原因,也算为了这位仁兄,我决定用最直白的语言来给大家讲讲Android的回调机制是怎么个回事,阅读这篇文章你不需要太高深的技术功底,只要你会点JAVA基本的知识,知道什么叫类什么叫接口怎么创建项目,我想相信你看完本章后必定会有收获。

废话不多说,像许多网上介绍回调机制的文章一样,我这里也以一个现实的例子开头:假设你公司的总经理出差前需要你帮他办件事情,这件事情你需要花些时间去做,这时候总经理肯定不能守着你做完再出差吧,于是就他告诉你他的手机号码叫你如果事情办完了你就打电话告诉他一声;这是一个现实生活中常能碰到的例子,我们用呢就用代码的方式来实现一个这个过程,看一下这个过程究竟是怎样的。

首先在Eclipse中新建一个Java项目:CallBackDemoInJava;

然后再新建三个类:Manager(该类用来模拟总经理)、Personnel(该类用来模拟员工)、Main(主类);


Manager的代码如下:

[java] view plaincopyprint?
  1. package com.aige.test;  
  2.   
  3. /** 
  4.  * @description 该类用来模拟总经理 
  5.  * @author Aige 
  6.  * @since 2014/11/6 
  7.  */  
  8. public class Manager {  
  9.     /** 
  10.      * @param personnel 
  11.      *            传入一个员工类的对象 
  12.      */  
  13.     public Manager(Personnel personnel) {  
  14.   
  15.         // 想让该让员工做什么  
  16.         personnel.doSomething(this"整理公司文件");  
  17.     }  
  18.   
  19.     /** 
  20.      * @description 当员工做完总经理让他做的事后就通过该方法通知总经理 
  21.      * @param result 
  22.      *            事情结果 
  23.      */  
  24.     public void phoneCall(String result) {  
  25.         System.out.println("事情" + result);  
  26.     }  
  27. }  
Manager类是个模拟总经理的类,当该类的对象被造出来后就会通过Personnel的对象去执行Personnel中的doSomething方法告诉员工做些什么

Personnel的代码如下:

[java] view plaincopyprint?
  1. package com.aige.test;  
  2.   
  3. /** 
  4.  * @description 该类用来模拟员工 
  5.  * @author Aige 
  6.  * @since 2014/11/6 
  7.  */  
  8. public class Personnel {  
  9.     public void doSomething(Manager manager, String task) {  
  10.   
  11.         // 总经理通过doSomething方法告诉员工要做什么  
  12.         System.out.println("总经理要你做" + task);  
  13.   
  14.         String result = "做完了";  
  15.   
  16.         // 当事情做完了我们就通过总经理公布的phoneCall方法通知总经理结果  
  17.         manager.phoneCall(result);  
  18.     }  
  19. }  
总经理通过调用Personnel中的doSomething方法告诉员工该做些什么,当员工做完后就通过Manager中的phoneCall方法通知总经理结果

那么好的!万事俱备,我们在Main中测试运行下代码看看结果:

[java] view plaincopyprint?
  1. package com.aige.test;  
  2.   
  3. public class Main {  
  4.     public static void main(String[] args) {  
  5.         // 首先我们需要一个员工  
  6.         Personnel personnel = new Personnel();  
  7.   
  8.         // 其次把这个员工指派给总经理  
  9.         new Manager(personnel);  
  10.     }  
  11. }  

代码执行结果如下:


回到我们刚才举的那个现实中的例子:总经理出差前要你去办件事情,这件事情通过doSomething告诉你了,事情要是办完了就打总经理的电话phoneCall通知他一声。这里的phoneCall我们就称为回调方法,为什么称之为回调呢?你问我我也不清楚哈~这你得问Sun公司了,不过我们从代码的执行过程可以看出数据的流向大致是Manager—–>Personnel—–>Manager,这不就是一个“回调”的过程么?现在我们来总结下满足回调的两个基本条件:

1.Class A调用Class B中的X方法

2.ClassB中X方法执行的过程中调用Class A中的Y方法完成回调

一切看上去都很完美~以上例子代码简单通俗地描述了回调,但是这里我就会有这样一个疑问:假设总经理出差前交了件事情给我去办,不巧……副总经理也要给我件事去办,更无耻的是……主管也发任务过来了,都要求说做完就打电话通知他们……这时我们就要定义更多类,什么总经理类啦~经理类啦~主管类啦~杂七杂八的类,但是这些杂七杂八的大爷们都要求做完事情就电话通知,每个类都会有一个类似phoneCall的方法作为回调方法,这时,我们利用面向对象的思想来看~是不是可以把这个回调方法抽象出来作为一个独立的抽象类或接口呢?多态的思想油然而生~~~鉴于JAVA接口的好处,我们就定义一个名为CallBack的接口作为回调接口,再在该接口下定义一个名为backResult的抽象方法作为回调方法,让那些总经理类啦~经理类啦~主管类啦~什么的都去实现该接口,这时候我们就来改造下我们的项目:


CallBack代码如下:

[java] view plaincopyprint?
  1. package com.aige.test;  
  2.   
  3. /** 
  4.  * @description 回调接口 
  5.  * @author Aige 
  6.  * @since 2014/11/6 
  7.  */  
  8. public interface CallBack {  
  9.   
  10.     // 回调方法  
  11.     public void backResult(String result);  
  12. }  

Manager代码改造后如下:

实现CallBack接口重写backResult方法

[java] view plaincopyprint?
  1. package com.aige.test;  
  2.   
  3. /** 
  4.  * @description 该类用来模拟总经理 
  5.  * @author Aige 
  6.  * @since 2014/11/6 
  7.  */  
  8. public class Manager implements CallBack {  
  9.     /** 
  10.      * @param personnel 
  11.      *            传入一个员工类的对象 
  12.      */  
  13.     public Manager(Personnel personnel) {  
  14.   
  15.         // 想让该让员工做什么  
  16.         personnel.doSomething(this"整理公司文件");  
  17.     }  
  18.   
  19.     /** 
  20.      * @description 当员工做完总经理让他做的事后就通过该方法通知总经理 
  21.      * @param result 
  22.      *            事情结果 
  23.      */  
  24.     public void backResult(String result) {  
  25.         System.out.println("事情" + result);  
  26.     }  
  27. }  

Personnel代码改造后如下:

doSomething方法不再传入一个Manager对象而是一个CallBack接口:

[java] view plaincopyprint?
  1. package com.aige.test;  
  2.   
  3. /** 
  4.  * @description 该类用来模拟员工 
  5.  * @author Aige 
  6.  * @since 2014/11/6 
  7.  */  
  8. public class Personnel {  
  9.     public void doSomething(CallBack callBack, String task) {  
  10.         // 总经理通过doSomething方法告诉员工要做什么  
  11.         System.out.println("总经理要你做" + task);  
  12.   
  13.         String result = "做完了";  
  14.   
  15.         // 当事情做完了我们就通过总经理公布的phoneCall方法通知总经理结果  
  16.         callBack.backResult(result);  
  17.     }  
  18. }  
Main代码不变,执行结果也是一样的。
0 0
原创粉丝点击