经常时候会用到各种回调,也会有人会问到我这个东东,今天这一篇文章,非常的简洁的能说明这个问题
先上张图
附上分析文档:
这里面以如下这个需求来理解和分析接口回调。
需求:老板的员工干活,但是老板不能时刻都在监控者员工干活的进度。那么就要求员工干完活以后,通知老板活干完了。
这也就要求老板,需要要接收员工通知的能力。那么这个能力有两种方式实现:
1.直接运用回调函数(实际上就普通的函数)
2.通过接口回调的模式
首先看第一个demo,理解什么是回调函数?
BOSS.java
public class Boss{
public void excute() {
System.out.println("收到了!!"+System.currentTimeMillis());
}
}
//============================================
这里面的excute方法,实际上工人干完活以后通过boss的实例去调用的。
那么这里面有一个问题,这个方法和别的方法没有任何区别。唯一的区别
这个方法,如果是boss无故调用是没有意义的。
出现的目的就是为了工人干完活以后的回调。
//============================================
employee.java
public class Employee {
private Boss boss;
//工人干活
public void doSome(){
//1.开始干活了
for(int i=0;i<10;i++){
System.out.println("第"+i+"事情干完了");
}
//告诉老板干完了
boss=new Boss();
//活干完了,老板的接收消息的方法(回调方法被调用)
boss.excute();
}
}
Client.java
public class Client {
public static void main(String[] args){
Employee emp=new Employee();
//开启控制对象的运行
emp.doSome();
}
}
上述这个例子,是最简单的回调函数的使用。在这个例子中可以看出回调函数,不过就是一个函数而已。
那么上面这个例子好像觉得不是那么高大上。
那么问题出在哪儿呢?
1.现在员工把活干完了,无论干完了什么样的活。最终回调了老板类的方法,执行的结果就只有一个,不
好定制化。这样的代码只能hardcode,实际开发中,应该尽量避免hardcode,才能使得程序更具有易扩
展性。
2.员工干完活,要告知老板。但是有一天如果需求增加了。不仅要告知老板,同时也也要告诉部门经理,
财务经理,总之需要就是有可能在不断的变化的。
这个时候,如果按照目前的这种写法就需要写一个manager类,在写一个回调方法。在主程序中,员工干
完活以后,同时要创建manager的类的对象。再次调用manager的回调方法。而且即使这样写了manager
类对象的方法调用,还是解决不了上述第一个问题进行解决。
更好的一种解决方式:
1.通过抽象类的方式。
2.通过接口的方式,实现回调。
CallBackInterface.java
public interface CallBackInterface {
//接口中的回调的方法声明
public void excute();
}
Boss.java
//这是接口回调方法的具体实现类
<pre name="code" class="java">public class Boss implements CallBackInterface{
@Override
public void excute() {
System.out.println("Boss.excute()我被调用了");
}
}
<pre name="code" class="java" style="font-size: 14px; line-height: 21px;">Emplyee.java
//会调用接口的类
<pre name="code" class="java">public class Emplyee {
//声明回调接口
private CallBackInterface backInterface;
//注册回调接口
public void setBackInterface(CallBackInterface backInterface) {
this.backInterface = backInterface;
}
public void doSometh() {
//开始做事情
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//事情做完后告诉老板
backInterface.excute();
}
}
<pre name="code" class="java" style="font-size: 14px; line-height: 21px;">MainActivity.java
//执行代码
<pre name="code" class="java">public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Emplyee emplyee = new Emplyee();
//将回调 对象(上层对象)传入,注册
emplyee.setBackInterface(new Boss());
//开启控制对象的运行,执行回调
emplyee.doSometh();
}
}
<span style="font-family: Tahoma, Helvetica, SimSun, sans-serif; font-size: 14px; line-height: 21px;">所以接口的回调比普通的函数的回调更为优化!</span>