说到接口回调,对于初学者来说,理解是真的难啊,不过没有关系,看完本篇文章,你马上就能理解接口回调啦!
概念
什么是接口回调?用我的理解,就是:A让B去做一件耗时的操作,而且并不知道要花费多少时间,B做完了后,告诉A事情做完了,并且把结果给A。当然,B在做这件事的时候,A还可以做其他事情
用途
假设有一个耗时的操作:在网上下载一张图片,我们并不知道下载这张图片具体要花费多少时间,于是我们开一个线程去下载图片,当该线程下载完图片后,把图片给需要的人。
用法
既然是接口回调,那就少不了接口啦:
public interface CallBack {
void callBack(String picture);
}
这里我们定义了一个接口,并且设置了一个方法,方法里的参数就是B执行完后返回给A的结果。
那么这个接口该怎么用呢?
这里我们假设一个场景:A需要在网上下载一张图片,但是A并不知道下载这张图片需要多少时间,于是A开了一个线程B去下载这张图片,并且B下载完后将图片给A。
这个B线程我们应该怎么写?
public class MyThread extends Thread{
private CallBack callBack;
public MyThread(CallBack callBack) {
this.callBack = callBack;
}
@Override
public void run() {
super.run();
// 模仿耗时操作
for (int i = 0; i < 10; i++) {
try {
Thread.sleep(500);
System.out.println("图片下载中。。。(假装耗时)");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
callBack.callBack("得的图片!!!");
}
}
接下来我来解释下怎么理解这个线程中的接口。
我们在线程中声明了一个接口,主要是为了在耗时操作完成后,使用这个接口中的那个callBack(String picture)方法。将结果丢到这个方法的参数中。
但是卧槽!这不就是一个接口吗,方法体在哪里,就算把结果传给了这个方法里面又有什么卵用??
我的结果呢?哪去了!!!
带着这些疑问,我们开始使用这个构造方法含有接口的线程。
使用:
MyThread myThread = new MyThread(new CallBack() {
@Override
public void callBack(String picture) {
System.out.println(picture);
}
});
myThread.start();
我们发现在使用这个线程的时候,需要在构造方法中传递一个已经实现了该接口的类,匿名类走起。
然后会在这个匿名类中生成一个方法,原来方法体在这里,我们发现这个方法还有可以利用的参数,没错!这个参数就是经过耗时操作返回给我们的结果,也就是那张图片!!
赶快运行一波!!!
运行结果:
图片下载中。。。(假装耗时)
图片下载中。。。(假装耗时)
图片下载中。。。(假装耗时)
图片下载中。。。(假装耗时)
图片下载中。。。(假装耗时)
图片下载中。。。(假装耗时)
图片下载中。。。(假装耗时)
图片下载中。。。(假装耗时)
图片下载中。。。(假装耗时)
图片下载中。。。(假装耗时)
得的图片!!!
这么简单易懂的代码真是骚的飞起!
这就是我对接口回调的理解及使用方法,希望你们看了这篇后再也不会为接口回调而烦恼!