学习安卓《第一行代码》遇到了回调机制,由于《JAVA编程思想》还没有看到这一部分,所以仓促翻阅了网上的帖子,结合自己的理解做了一点整理,如果有错误希望指出!多谢!
先来看看概念,所谓回调:就是A类中调用B类中的某个方法c,然后B类中反过来调用A类中的方法d,d这个方法就叫回调方法。这么说让人一头雾水,我们先来看一个比较经典的回调方式
Class A实现接口CallBack——背景1
Class A中包含一个Class B的引用b ——背景2
Class B有一个参数为callback的方法f(CallBack callback) ——背景3
A的对象a调用B的方法 f(CallBack callback) ——A类调用B类的某个方法c
然后b就可以在f(CallBack callback)方法中调用A的方法 ——B类调用A类的某个方法d
下面的代码非常简单,大概实现的是A问B一个问题,然后B对A作出回答,我们先来阅读一下代码,注意代码中的注释
public interface CallBack {
//回调函数
void solve(String result);
}
public class A implements CallBack{ //Class A实现接口CallBack ——背景1
private B b = new B(); //Class A中包含一个Class B的引用b ——背景2
public void askQuestion(String question) {
//A的对象a调用B的方法 f(CallBack callback) ——A类调用B类的某个方法c
b.executeMessage(A.this, question);
}
@Override //重写接口方法
public void solve(String result) {
System.out.println("B的回答是:" + result);
}
}
public class B {
//Class B有一个参数为callback的方法f(CallBack callback) ——背景3
public void executeMessage(CallBack callBack, String question) {
System.out.println("A的问题是:" + question);
String result = "我不知道!";
//然后b就可以在f(CallBack callback)方法中调用A的方法 ——B类调用A类的某个方法d
callBack.solve(result);
}
}
public class Test {
public static void main(String[] args) {
A a = new A();
a.askQuestion("1+1=几?");
}
}
程序的运行结果是:
A的问题是:1+1=几?
B的回答是:我不知道!
再来体会一个例子
public interface CallBack {
// 回调函数
void solve();
}
public class A {
public static void main(String[] args) {
// Class A中包含一个Class B的引用b ——背景2
B b = new B();
// A的对象a调用B的方法 f(CallBack callback) ——A类调用B类的某个方法c
b.executeMessage(new CallBack() {// Class A实现接口CallBack——背景1,这里是匿名实现的
@Override
public void solve() {
System.out.println("我被调用了");
}
});
}
}
public class B {
// Class B有一个参数为callback的方法f(CallBack callback) ——背景3
public void executeMessage(CallBack callBack) {
System.out.println("回调前。。。");
// 然后b就可以在f(CallBack callback)方法中调用A的方法 ——B类调用A类的某个方法d
callBack.solve();
System.out.println("回调后。。。");
}
}
程序的运行结果是:
回调前。。。
我被调用了
回调后。。。
上面的例子也可以这样写,实现同样的效果,我们一起体会一下
public interface CallBack {
// 回调函数
void solve();
}
public class A {
//Class A实现接口CallBack——背景1(这里通过创建接口对象来实现背景1)
static CallBack callBack = new CallBack() {
@Override
public void solve() {
System.out.println("我被调用了");
}
};
public static void main(String[] args) {
//Class A中包含一个Class B的引用b ——背景2
//A的对象a调用B的方法 f(CallBack callback) ——A类调用B类的某个方法c
//下面创建B类对象b这条语句,同时实现了上述2行注释的内容
B b = new B(callBack);
b.test();
}
}
public class B {
CallBack callBack;
//Class B有一个参数为callback的方法f(CallBack callback) ——背景3
public B(CallBack callBack) {
this.callBack = callBack;
}
public void test() {
System.out.println("回调前。。。");
//然后b就可以在f(CallBack callback)方法中调用A的方法 ——B类调用A类的某个方法d
callBack.solve();
System.out.println("回调后。。。");
}
}
程序的运行结果是:
回调前。。。
我被调用了
回调后。。。
注意最后一个例子中,Class B的构造函数的参数就是一个接口对象,这一点非常巧妙,相信通过注释内容你能够体会到,今天先写到这里,这些内容暂时够初学者使用了。我会在以后的实践中深入了解回调机制,届时再回来更新帖子。如果有错误希望指出!多谢!