回调(callback)机制

来源:互联网 发布:js生成随机数 编辑:程序博客网 时间:2024/05/23 15:49

一. 前言

        回调(callBack)是使用频率非常高的一种编程技巧,它是2个对象间通信的一个手段.曾经看到知乎上一个比较浅显易懂的说法:

        你到一个商店买东西,刚好你要的东西没有货,于是你在店员那里留下了你的电话,过了几天店里有货了,店员就打了你的电话,然后你接到电话后就到店里去取了货。在这个例子里,你的电话号码就叫回调函数,你把电话留给店员就叫登记回调函数,店里后来有货了叫做触发了回调关联的事件,店员给你打电话叫做调用回调函数,你到店里去取货叫做响应回调事件。回答完毕。 (链接:https://www.zhihu.com/question/19801131)


二. 分析问题

        现在写个小程序来实践下.分析下这个问题,可以看到:
        对象:PersonA(店员), PersonB(我)
        分别拥有啥和干了啥: PersonB(我): 有一个作为回调函数的号码,一个注册函数.
                                 PersonA(店员):  等待货物的到来,货物来了回调回调函数.

三. 解决问题

        这里我们用,回调接口来实现回调函数,以它来作为二者的桥梁。用java语言,在android studio 上实现,首先写一个接口类CallBack.java,其内容为:
package com.example.test;public interface CallBack {    void onCallBack();}

        然后,我们实现PersonB.java类.其主要任务为2个,其一,定义和new一个回调函数对象,其二,把这个对象注册到PersonA当中去.
package com.example.test;public class PersonB {    private String name;   public MCallBack mCallBack;    private boolean haveGoods = true;    public PersonB(String str){        name = str;        mCallBack = new MCallBack();    }    public class MCallBack implements CallBack{        @Override        public void onCallBack() {            System.out.println("PersonA: PersonB,Your goods has arrived! ");        }    }    public void testCallBack(){        System.out.println("PersonB: PersonA, Call me if you have goods!");        new PersonA("PersonA").notifyIfGoodsArrived(haveGoods,mCallBack);    }}


        接下来实现PersonA.java为,其主要任务也为2个,其一为完成PersonB交代的任务(这里开启一个线程睡3s来模拟这个任务), 其二,完成任务后,通过收到的回调接口(来之PersonB)通知PersonB:
package com.example.test;public class PersonA {    public String name;    public PersonA(String str){        name = str;    }    public void notifyIfGoodsArrived(final boolean haveGoods, final CallBack mCallBack){        if (haveGoods){            //start the task to wait for the goods.            new Thread(){                @Override                public void run() {                    try{                        //Suppose the goods come after 3 seconds.                        sleep(3000);                    } catch(InterruptedException e){                        e.printStackTrace();                    }                    mCallBack.onCallBack();                }            }.start();        }    }}

        最后编写一个测试类MyClass.java
package com.example.test;public class myClass {    public static void main(String[] args){        new PersonB("PersonB").testCallBack();    }}

        测试结果:

PersonB: PersonA, Call me if you have goods!PersonA: PersonB,Your goods has arrived!Process finished with exit code 0

四. 结论

        结果基本的实现了我们的目标, 注意不要用PersonB 来implement CallBack, 因为传一个接口把自己完全暴露给PersonA, 隐私都没了.这样可能会导致数据不安全.

 

原创粉丝点击