在学习Android的过程中接触到了java的回调机制,比如按钮的监听回调,又比如开启一个子线程,在子线程完成任务的时候通知主线程.
其实JAVA的回调机制并不是非常高深的原理,不需要继承什么类. 只要有一点点接口interface和多线程Thread(只要了解就行)的知识,就能够学得会.
首先,java中的回调机制,是为了解决什么问题呢?
我认为是为了实现两个类之间的合作,和信息传递.
其中一个是主类,负责调用另外一个被调用类, 而另外一个类在完成了工作之后,重新调用主类.
打个现实中的比方:我是总经理,我手头上工作很多,突然我遇到一个比较耗费时间的问题,我当然不能自己解决.所以我打电话给了我一个员工,叫他去解决问题.并且告诉他我的电话一直开着,你解决的问题就马上打回来给我.
这在JAVA中的实现:
其中A是总经理 B是员工
1 定义一个接口 2 A调用B的方法并在参数中传入一个接口实现类实例 3 B中得到参数中的接口实现类实例,并执行完任务之后,调用接口实现类实例的方法.
这样子说你可能就懵逼了.不过在下面代码中我们将一步一步慢慢解析:
首先定义一个接口:
public interface Listener {
public void finish(int result); //接口中唯一抽象函数,这里加不加abstract无所谓
}
首先是总经理A
public class A {
public void workOfA() {
System.out.println("A遇到问题,赶紧开个了线程找B");
new Thread(new Runnable() { //首先,我们在A工作中遇到问题时,开启了一个子线程
@Override //在子线程中我们创建了一个B实例,并调用了B的方法,并在参数中传入了
public void run() { //一个通过匿名内部类实现Listener接口的实例
// TODO Auto-generated method stub
B b = new B();
b.workOfB(1, 2, new Listener() { // 这里创建一个匿名内部类实现了Listener接口,
// 并且实现了Listener的方法,方法内容是
// 当B完成任务之后 希望执行的代码.
@Override
public void finish(int result) {
// TODO Auto-generated method stub
resolve(result);
}
});
}
}).start();
}
public void resolve(int x) {
System.out.println("A我知道答案了:" + x);
}
}
然后是员工B
public class B {
Listener listener;
public void workOfB(int i, int j, Listener listener) {
this.listener = listener; //员工B首先要取得这个listener接口实现类
try {
for (int c = 1; c <= 5; c++) {
Thread.sleep(1000); //这里线程休眠了一会,模拟B的工作是要时间的
System.out.println("B思考了" + c + "秒");
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
int result = i + j; //这是工作主体,计算了传进来的i 和 j的和
listener.finish(result); //工作完成之后呢,调用接口中的方法,而方法主体记得吗,就是在A中实现的方法.
//这里为什么可以这么做,我觉得算是JAVA中多态的一种体现,我只管调用这个抽象函数,
//而抽象函数的具体实现,由A自己来定义
}
}
最后是我们的测试环节,在主函数Main中测试
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
A a = new A();
a.workOfA();
}
}
<pre name="code" class="java">最终结果::
A遇到问题,赶紧开了个线程交给B
B思考了1秒
B思考了2秒
B思考了3秒
B思考了4秒
B思考了5秒
A我知道答案了:3
本人初学者,有什么理解的不好的地方还望大神指出.
也希望更多的JAVA Android学习者一起交流.