一、什么是接口回调
网络上有很多关于接口回调技术的文章,但是看来看去,都是一些专业术语,这指针那指针的,初学者要看三四篇文章估计才能明白,今天我就用大白话给大家介绍什么是接口回调
如果你还不懂java接口,还是先去学习一下,回来再看我这篇文章.
回调:从字面意思上也应该很好理解,举一个栗子,我的老师交代给我一个任务,让我调查学生对哪个编程语言的兴趣最高,但是老师也不能一直等着我给她答案,毕竟老师也是很忙的,于是老师说:"你调查完后把文件发到我微信上".
这里的"发到我微信上"就可以看作一个回调,当我调查完成之后,将结果发往老师微信.完成一次任务.
接下来就看代码如何实现上诉"回调"
二、定义回调接口
接口如何定义?,以及接口内的方法如何定义?
从上述的案例可以看出,回调指的是"将结果发往老师微信",那好,我们就定义一个interface 叫做IResultCallback,里面有一个方法,叫做sendResult();但是光有一个方法貌似不够,既然是发,那么,发什么东西?当然是发学生对这个兴趣最高的语言了.那我们给sendResult方法加个参数sendResult(String language).Ok
public interface IResultCallback {
void sendResult(String language);
}
三、定义处理者
回头在看上述案例,谁在调查?当然是我了,那就定义一个我,但是只有我还是不够的,你总的给我一个回调地址把吧让我知道我处理完后发给谁?
这里的IResultCallback就是上面定义的回调地址,
在Student的构造方法中,要求传入一个IResultCallback的实例,在java中,谁实现了它,就调用谁,那是不是要定义一个老师去实现这个接口,然后传给这个学生,当然
public class Student {
/**
* 回调接口
*/
private IResultCallback mCallback;
/**
*
* @param mCallback 回调地址,当我处理完后,将结果发送到这个的接口实现类
*/
public Student(IResultCallback mCallback) {
super();
this.mCallback = mCallback;
}
public void doTopLanguage() {
try {
Thread.sleep(2000);
mCallback.sendResult("VB");//回调
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
四、定义老师
老师要做的事情就是交给学生任务,然后等待....等待...
public class Teacher implements IResultCallback{
public Teacher() {
/**
* 这个老师一出生就要分配给学生任务
*/
Student student =new Student(this);
student.doTopLanguage();
}
@Override
public void sendResult(String language) {
System.out.println("老师:学生最喜欢的语言居然是: "+language +" !!!!");
}
}
五、测试及结果
public class Main {
public static void main(String[] args) {
new Teacher();
}
}
//输出:
//老师:学生最喜欢的语言居然是: VB !!!!
嗯,是VB没错了
首先说明的是,在这个实例中,并没有说学生在做调查的时候,老师可以干其他的事情,因为没有在Student中开启一个新线程,怕初学者没学多线程,还不太明白.但是还是给出下面实例.
public class Teacher implements IResultCallback{
public Teacher() {
/**
* 这个老师一出生就要分配给学生任务
*/
Student student =new Student(this);
student.doTopLanguage();
System.out.println("老师:我去干其他事情了");
}
@Override
public void sendResult(String language) {
System.out.println("老师:学生最喜欢的语言居然是: "+language +" !!!!");
}
}
public class Student {
/**
* 回调接口
*/
private IResultCallback mCallback;
/**
*
* @param mCallback 回调地址,当我处理完后,将结果发送到这个的接口实现类
*/
public Student(IResultCallback mCallback) {
super();
this.mCallback = mCallback;
}
public void doTopLanguage() {
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(2000);
mCallback.sendResult("VB");//回调
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}).start();
}
}
//输入:
//老师:我去干其他事情了
//老师:学生最喜欢的语言居然是: VB !!!!