初识Java回调机制

学习安卓《第一行代码》遇到了回调机制,由于《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的构造函数的参数就是一个接口对象,这一点非常巧妙,相信通过注释内容你能够体会到,今天先写到这里,这些内容暂时够初学者使用了。我会在以后的实践中深入了解回调机制,届时再回来更新帖子。如果有错误希望指出!多谢!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值