案例参考网上资料:
简单实现了回调,这个在ANDROID中有很大的用处
比如你写了两个类A和B,并且各生成一个对应的实例a 和b ,在a 中有一个方法fa( 此方法只负责生成两个随机数)要调用b中的一个方法fb(此方法对两个数进行求各) 来进行求和,fb求得结果后要调用a的另一个方法ffa(此方法用于显示求得的结果),这时ffa就叫作回调函数,(反回来调用一下的意思)
为什么要这么麻烦呢,如果fb直接返回结果不好吗,试想如果fb执行时间较长,那么fa就会一直等结果而导致fa不往下执行了,此时如果用回调这个功能实现,由于 回调函数一般是由系统异步调用的,方法fa调用fb后就不用等而直接往下执行,比如可以再生成两随机数给fb,fb会依次得到结果后通过回调机制来调用ffa显示出来,其实就是为实现生成随机数和计算随机数的异步执行。好象fa和fb是两个独立执行的线程,提高程序效率。
根据上面的理论,以后为基本模型如下:
类A有一个fa()方法,方法的作用是获得二个随机数,同时实现了接口Result,且实现了接口的方法,这个方法称之为回调方法,给类B调用的
public class A implements Result{
// 生成二个随机数
public Num fa() {
Num num = new Num();
num.setNum1((int) (Math.random() * 100));
num.setNum2((int) (Math.random() * 100));
return num;
}
//实现了这个接口,实现接口中的方法
@Override
public void result(int result) {
System.out.println("拿到了结果,"+result);
}
}
类B中直接将接口new出对象,并且当作构造方法,这样类A能传递到类B中,这里模拟一个耗时操作,当5S后,运行接口方法,在Android中可以理解为异步操作,来控制母页面,这样变能View来刷新了
public class B {
Result result;
public B(Result result) {
this.result = result;
}
public void fb(Num num) {
final int temp = num.getNum1() + num.getNum2();
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
result.result(temp);
}
}).start();
}
}
结果:这里就是运行的结果,当这里随机数产生了,结果也求得了,经过一个耗时操作得到结果的输出(刷新页面)
public static void main(String[] args) {
A a = new A();
System.out.println("A对象有了");
Num num = a.fa();
System.out.println("随机数有了");
B b = new B(a);
System.out.println("B对象有了");
b.fb(num);
}