回调(callback)机制

一. 前言

        回调(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, 隐私都没了.这样可能会导致数据不安全.

 

你可能感兴趣的:(回调(callback)机制)