您的位置:首页 > 其它

回调(callback)机制

2017-12-08 23:02 204 查看

一. 前言

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

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: