java回调机制详解

回调介绍

所谓回调,就是客户程序Client调用服务程序Service中的某个方法A,然后Service又在某个时候反过来调用Client中的某个方法B,对于Client来说,这个B便叫做回调函数。
这里写图片描述

回调的如何实现的呢

java的回调是通过接口或者内部类来实现的。

JAVA方法回调是功能定义和功能实现分享的一种手段,是一种耦合设计思想。作为一种架构,必须有自己的运行环境,并且提供用户的实现接口。

代码案例

这里就上面的讲解写一个最简单的例子:
第一步:因为方法的回调是通过接口来实现的所以要定义一个接口(我们称它为回调接口)

/**
 * 定义一个回调接口,包含一个回调函数
 * @author Administrator
 */
public interface CallBack {
    /**
     * 这就是Service回调Client的方法
     * @param result 回调时携带的参数(可选)
     */
    public void B(String result);
}
/**
 * 这个Client类, 实现CallBack接口(条件一)
 * @author Administrator
 *
 */
public class Client implements CallBack{

    /**
     * Client类 包含 Service类 的引用 (条件二)  因为Client要调用Service中的方法
     */
    Service service = new Service();//可直接实例化或在构造函数或某个方法中进行实例化

    /**
     * 该方法用于请求Service调用Service中的方法
     */
    public void requrst(){
        System.out.println("请求服务器调用服务器的方法");
        service.A(this);//传入当前对象也就是CallBack对象,因为Client实现类CallBack接口
    }



    /**
     * Service回调Client的实现方法
     */
    @Override
    public void B(String result) {
        // TODO Auto-generated method stub
        System.out.println("服务器回调我的方法返回的结果是:"+result);
    }

}
public class Service {

    CallBack callback;//定义接口类型对象,要调用接口中的回调方法

    String result = "谢谢你的请求";

    public void sendManage(Client client) {
        this.callback = client;
        callback.B(result);//调用的是该接口的实现方法(即Client中的B)
    }


}

测试类

public class Test {
    public static void main(String[] args) {
        Client client = new Client();
        client.requrst();
    }
}

输出结果:

请求服务器调用服务器的方法
服务器回调我的方法返回的结果是:谢谢你的请求

回调实现的步骤

以上就是一个简单实现接口回调的机制,我们总结一下实现的所需的步骤:
1、定义回调接口和回调方法
2、Client实现回调接口和回调方法,并在Client中包含Service引用,通过引用调用Servie中的方法并且必须传入一个当前对象Client(因为当前对象实现了CallBack接口所以也属于接口对象)
3、在Service中定义一个接口对象并在方法中对初始化(将Client传过来的当前对象赋值给接口对象),通过接口对象调用接口中方法(调用的Client实现的接口方法)
4、测试

回调的综合案例(异步+回调)

以下一个比较综合的例子使用到了“异步+回调”
比如生活中的实例,某天,我打电话向你请教问题,当然是个难题,^_^,你一时想不出解决方法,我又不能拿着电话在那里傻等,于是我们约定:等你想出办法后打手机通知我,这样,我就挂掉电话办其它事情去了。过了XX分钟,我的手机响了,你兴高采烈的说问题已经搞定,应该如此这般处理。
故事到此结束。这个例子说明了“异步+回调”的编程模式。其中,你后来打手机告诉我结果便是一个“回调”过程,结果(即处理方法)就是一个回调函数。
我的手机号码必须在以前告诉你,即告诉你通过何种方式可以找到我,这便是注册回调函数;我的手机号码应该有效并且手机能够接收到你的呼叫,这是回调函数必须符合接口规范。

案例实现接口回调的步骤:
1.定义一个回调接口包含回调方法(这是接口约定,有答案时电话联系)
2.我(Me.java)这个类实现回调接口和提供回调方法的实现,并向你注册回调(因为只有向你注册了回调你才能回调我的方法告诉我答案)
3.你(You.java)这个类提供了接收问题并回答(回答就是我向你注册的回调参数类型为接口对象)的方法
4.测试类

/**
 * 定义一个回调接口,包含一个回调函数
 * @author Administrator
 */
public interface CallBack {
    /**
     * 当你知道答案可以调用该回调函数告诉我答案
     * @param result 答案
     */
    public void solve(String result);
}

/**
 * 这个类代表我,因为你要告诉我答案所以要实现CallBack回调接口和接口中的回调方法的实现
 * 我要向你提问所以有一个提问的方法askQqstion(),在提问的同时要向对方(你)注册回调接口,当你知道答案的时候调用我里面的接口实现方法,最后得到答案
 * @author Administrator
 *
 */
public class Me implements CallBack{

    /**
     * 我(Me)这里包含一个对你(You)的引用
     * 因为我(Me)要调用你(You)里面的方法向你询问(问题的描述)和注册回调(用于你告诉我答案)
     */
    private You you;

    public Me(You you){
        this.you = you;     //实例化引用
    }


    /**
     * 我通过这个方法向你进行提问,在提问时进行回调注册,让你在知道答案是可以告诉我
     * @param question  问题的描述
     */
    public void askQqstion(final String question){

        //异步
        new Thread(new Runnable() {

            @Override
            public void run() {
                /**
                 * 我调用你的方法,在这里向你注册回调接口
                 */
                you.executeMessage(Me.this, question);              
            }
        }).start();     
    }   


    // 我问完问题后就挂掉电话,让你去思考问题的答案同时我也可以去做别的事
    public void play(){
        System.out.println("我去完了");
    }


    /**
     *当你知道答案后调用此方法告诉我,就是所谓的回调方法
     */
    @Override
    public void solve(String result) {
        System.out.println("你告诉我的答案是--->"+result);
    }
}
public class You {

    /**
     * 接收我的问题和基友回答问题的
     * @param callBack 接口回调对象,通过该对象可以调用实现了该接口的对象(Me)中的接口实现方法(Me中的solve()方法)
     * @param question 问题描述
     */
    public void executeMessage(CallBack callBack, String question){

        //模拟你要思考很长时间
        for(int i=0;i<10000;i++){

        }   


        /**
         * 想到了答案
         */
        String result = "答案就是我也不知道";    


        /**
         * 想到后你就打电话告诉我,放过来调用我这个类中的回调方法
         */
        callBack.solve(result);     
    }
}
/**
 * 测试类
 * @author Administrator
 *
 */
public class Test {

    public static void main(String[] args) {
        //两个对象一个我一个你
        You you = new You();
        Me me = new Me(you);

        //我向你提问
        me.askQqstion("世界到底有多大?");
    }
}

输出结果:

你告诉我的答案是—>答案就是我也不知道

回调函数(方法)小总结:

1.回调函数也是一个函数或过程,不过它是一个由调用方自己实现,供被调用方使用的特殊函数。
2.即调用方A不直接使用此函数function,而是通过调用被调用方B来间接调用function。

通过上面的那个例子你是不是差不多明白了回调机制呢,上面是一个异步回调,就是我去做我的事但是我还是在等你的答案,相应的也有同步回调。线程run()也是一个回调方法,当执行Thread的start()方法就会回调这个run()方法,还有处理消息都比较经典等等

Android中的回调机制

比较笨的一种认识:Android中以on开头的方法都是回调方法:onCreate (),onStart (),onPause (),onStop()等等。
在Activity中定义了很多生命周期的不同状态要调用的方法,这些方法都是空实现,系统框架要调用,用户也要调用来实现。
1.以上可以看出,接口(系统框架)是系统提供的,接口的实现是用户实现的,这样可以达到接口统一,实现不同的效果。  
2.系统在不同的状态“回调”我们的实现类,来达到接口和实现的分类。

  • 6
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值