Java中回调的理解

回调在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

接下来我将通过一个demo说明,假设我需要实现一个类似下载完成的监听方法。具体就是Download这个类可以实现下载,给它的构造方法中传入我们需要下载的数据量,其开始下载,并且提供了下载完成的监听,当下载成功或者失败后调用对应的回调方法。

首先,定义一个下载完成的接口,接口中包含了下载完成后的两个回调方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/**
* 下载完成的回调接口
* 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则为下载成功,否则下载失败。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
/**
* 模拟下载的类,里面有一个设置下载完成的监听
* 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)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
/**
* 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值之后,变开始进行循环,模拟下载过程,然后根据下载结果调用相应的方法展示数据。输出结果如下:

如果觉得本文对你有帮助,请支持我!