回调在Java中运用的相当广泛,类似Android中的控件点击监听事件(setOnClickListener()方法)就是典型的回调。回调是什么?关于回调的定义通俗地说就是:A类调用B类中的某个方法,然后B类中反过来调用A类中的方法D,D这个方法就叫做回调方法。在Java中回调的这个方法D一般是接口中定义,然后A类通过实现接口的D方法。
一般回调的话需要满足以下几个条件:
- Class A实现接口CallBack callback ——场景1
- class A中包含一个class B的引用b ——场景2
- class B有一个参数为callback的方法f(CallBack callback) ——场景3
- A里的B的引用调用B的方法 f(CallBack callback) ——A类调用B类的某个方法C ——场景4
- 然后b就可以在f(CallBack callback)方法中调用A的方法 ——B类调用A类的某个方法D ——场景5
/**
* 下载完成的回调接口
* Created by zhangyongming on 2016/12/12.
*/
public interface OnDownloadCompleted {
/**
* 下载成功的回调
*/
void onSuccess();
/**
* 下载失败的回调
*/
void onFail();
}
然后是Download类:Download类有一个setOnDownloadCompletedListener(OnDownloadCompleted onDownloadCompleted)方法(相当于场景3),在该方法中模拟了下载过程,并且根据下载的结果调用了Test类的onSucess()跟onFail()方法(相当于场景5,这两个方法是Test类实现了OnDownloadCompleted接口后实现的方法),在这里我们模拟如果下载结果为100则为下载成功,否则下载失败。
/**
* 模拟下载的类,里面有一个设置下载完成的监听
* Created by zhangyongming on 2016/12/12.
*/
public class Download {
private int progress;
public Download(int progress) {
this.progress = progress;
}
// class B有一个参数为callback的方法f(CallBack callback) ——场景3
public void setOnDownloadCompletedListener(OnDownloadCompleted onDownloadCompleted) {
for (int i = 0; i <= progress; i++) {
System.out.println("下载进度: " + i + "%");
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 然后b就可以在f(CallBack callback)方法中调用A的方法 ——B类调用A类的某个方法D ——场景5
if (progress == 100) {
onDownloadCompleted.onSuccess();
} else {
onDownloadCompleted.onFail();
}
}
}
然后是Test类方法:Test类实现了OnDownloadCompleted接口,实现了onSuccess()方法跟onFail()方法(场景1);Test类包含了Download类的引用(场景2),Download的实例调用了setOnDownloadCompletedListener()方法(场景4)。
/**
* Class A实现接口CallBack callback ——场景1
* Created by zhangyongming on 2016/12/12.
*/
public class Test implements OnDownloadCompleted {
public static void main(String[] args) {
// class A中包含一个class B的引用b ——场景2
Download download = new Download(20);
// A里的B的引用调用B的方法 f(CallBack callback) ——A类调用B类的某个方法C ——场景4
download.setOnDownloadCompletedListener(new Test());
}
@Override
public void onSuccess() {
System.out.println("┏━━━━━┳━━━━━┓");
System.out.println("┃ ┃ ┃");
System.out.println("┃ ┃");
System.out.println("┣━ 下载完成 ━┫");
System.out.println("┃ ┃");
System.out.println("┃ ┃ ┃");
System.out.println("┗━━━━━┻━━━━━┛");
}
@Override
public void onFail() {
System.out.println("┏ ━ ━ ┳ ━ ━ ┓");
System.out.println(" ");
System.out.println("┃ ┃");
System.out.println(" 下载失败 ");
System.out.println("┃ ┃");
System.out.println(" ");
System.out.println("┗ ━ ━ ┻ ━ ━ ┛");
}
}
上述demo我们输入一个int值之后,变开始进行循环,模拟下载过程,然后根据下载结果调用相应的方法展示数据。输出结果如下: