回调

00、What - 什么是回调 ?

回调机制最早应用于框架编程技术,是指在编写框架/类库(比如Android底层实现)时,需要上层模块提供具体实现的代码的机制;上层模块所提供的这种代码则称为回调函数。说人话,请看图一。

图1

【注意】文中提及框架/类库只是为了形象化说明是底层实现;同样地,App也只是为了形象划说明是上层实现。回调技术不仅仅用于框架设计中,其本质上是分层思想,同样适用于我们业务代码的实现。

01、How - 回调的极简实现步骤

要实现回调技术,一般由以下四个步骤组成:

  • 定义回调接口:先定义一个回调接口,该接口里面声明了回调函数;一般由框架提供。
  • 定义回调对象:上层程序App实现该接口,并在回调函数中实现了具体的功能;由App实现。
  • 注册回调对象:底层框架添加回调对象;一般由App调用框架的函数实现。
  • 调用回调函数:框架函数调用App里面的回调函数,完成回调过程。

按照回调调用方式的实现不同,一般可分为同步回调与异步回调。我们一起分别来看看。

02、同步回调

代码1定义了回调接口,App需要实现该接口。

//【步骤1】定义回调接口

//该接口一般需要上层App进行实现
//底层则利用该接口类型完成对上层App的函数调用
public interface IMessage {
    public void sendMessage(String msg, boolean isOK);
}

代码2为底层框架函数,在该函数中通过回调接口类型的引用,实现对App函数的调用。

//定义底层框架类
public class Android {
    //框架类提供的库函数
    public void sysSendMsg(String msg, IMessage iMsg){
    int len = (msg == null)? 0 : msg.length();
    //调用Android框架类中的其他函数
    //完成发送消息的任务
    //.....
        
    //通过接口类型,完成对上层App的函数的调用
        //【步骤4】调用回调函数
    if(len <= 140){
        iMsg.sendMessage(msg, true);
    }else{
        iMsg.sendMessage(msg, false);
    }
    }
}

代码3定义回调对象,也就是App类。

//【步骤2】定义回调对象
public class App implements IMessage {
    //实现框架类提供的接口,返回框架执行的状态
    //该函数为【回调函数】
    @Override
    public void sendMessage(String msg, boolean isOK) {
    if(true == isOK){
        System.out.println("Android had" + "been sended msg: " + msg +  " is successfully!");
        }else{
        System.out.println("Android had " + "been sended msg: " + msg +   " is failed!");
    }
    }
    
    //App自定义的功能函数
    //此外,由于向Android传入了App.this对象,
    //其实也就是实现了【步骤3】回调函数的注册
    public void appSendMessage(String msg, Android android){
    //执行发送消息
    android.sysSendMsg(msg, App.this); 
       //响铃一声
    beer();
    }
    
    //执行一声响铃
    public void beer(){
    System.out.println("Beer....");
    }
}

代码4为测试客户端,介绍了典型的回调使用方法。

public class TestCallback {
//测试客户端
    public static void main(String[] args) {
    //定义App对象引用
    App app = new App();
    //定义框架对象引用
    Android android = new Android();
    //App函数调用,并传入底层框架对象引用
    app.appSendMessage("Hello world!", android);
    }
}

03、异步回调

异步回调与同步回调的区别就在于是否需要等待底层框架模块的返回结果:异步回调不需要等待;同步回调需要一直等待完成。
异步回调实现的方式基本与同步回调方式类似,只是在上述App(上层类)实现方式(利用线程技术)有所差异,其他代码完全一致。

//App实现类
public class App implements IMessage {
    
    //......
    
    //App自定义的功能函数
    //此外,由于向Android传入了App.this对象,
    //其实也就是实现了回调函数的注册
    //利用线程的方式,实现异步调用
    public void appSendMessage(final String msg,
                            final Android android){
    //利用线程的方式,实现执行发送消息的过程
    new Thread(new Runnable(){
        @Override
        public void run() {
        //执行发送消息
        android.sysSendMsg(msg, App.this);
        }
    }).start();

    //响铃一声
    beer();
    }
    
    //......
}

04、通过内部类实现回调

此外,我们在传入App对象引用的时候,我们可利用【接口+匿名内部类】的技术组合达到相同的目的,具体实现方式见代码5。个人比较喜欢这样的实现方式,因为够简洁,够清楚。

//App自定义的功能函数
//此外,由于向Android传入了App.this对象,其实也就是实现了
//回调函数的注册
public void appSendMessageByAnonymous(final String msg,
                final Android android){
    //执行发送消息
    //利用匿名内部类的形式传入App对象引用并实现回调函数
    //这样的方式很简洁
    android.sysSendMsg(msg, new IMessage(){
        @Override
    public void sendMessage(String msg, boolean isOK) {
        if(true == isOK){
        System.out.println("Android had been " +
            "sended msg: " + msg + " is successfully!");
        }else{
        System.out.println("Android had been " +
            "sended msg: " + msg + " is failed!");      
        }
    }
    });

    //响铃一声
    beer();
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,133评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,682评论 3 390
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,784评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,508评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,603评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,607评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,604评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,359评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,805评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,121评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,280评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,959评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,588评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,206评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,442评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,193评论 2 367
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,144评论 2 352

推荐阅读更多精彩内容