回调是一种特殊的调用, 调用有三种方式:同步调用, 回调

回调就是在类A中持有一个接口的对象, 但是并不在A类中实现该接口的方法, 而是交给B类去实现, 但是B本身不会调用该方法, 而是供A类去使用.

以Button为例

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
class Activity implements IListener{

private Button mButton;

public void onCreate(){
mButton=new Button();
mButton.setOnClickListener(this);
mButton.doClick();
}

@Override
public void onClick() {
StdOut.println("onClick");
}
}

interface IListener{
public void onClick();
}

class Button{

IListener mListener;

public void setOnClickListener(IListener listener){
mListener=listener;
}

public void doClick(){
mListener.onClick();
}

}

场景类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class Client_Button {
public static void main(String[] args){
// Button button=new Button();
// button.setOnClickListener(new IListener() {
// @Override
// public void onClick() {
// StdOut.println("onClick");
// }
// });
//
// button.doClick();

Activity activity=new Activity();
activity.onCreate();
}
}

---
onClick

Java

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
35
36
37
interface Callback{
public void solve(String str);
}

class B implements Callback{
private A a;
public B(A a){
this.b=b;
}

public void askQuestion(final String question){

// //加一个线程就是异步回调, 把线程去掉直接doSomething就是同步调用
// new Thread(new Runnable() {
// @Override
// public void run() {
a.doSomething(A.this,question);
// }
// }).start();
}

@Override
public void solve(String str) {
StdOut.println("the answer is "+str);
}
}



class A{

void doSomething(Callback callback,String question){
StdOut.println("A gets question: "+question);
StdOut.println("A do something");
callback.solve("solved");
}
}
1
2
3
4
5
6
7
8

public class Client_Java {
public static void main(String[] args){
A a=new A();
B b =new B(a);
b.askQuestion("a's question");
}
}