也谈 Android 中的回调

在 Android 系统中,回调几乎随处可见,最常见的就是给点击事件设置监听,如下:

如果你开发过 Android 应用,相信上面的代码你不会陌生。下面就根据我的理解谈一谈啥是回调,为啥使用回调,以及如何在自己的代码中定义回调。

0x00. 什么是回调?

我们先来看一下百度百科中对回调的定义:

回调是一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口。

看不懂?没关系,我们再来看下面这段话:

在面向对象的语言中,回调是通过接口或抽象类来实现的,我们把实现这种接口的类称为回调类,回调类的对象成为回调对象。

我们来把上面两句话归结一下:

回调就是抽象类(或接口)的实例实现父类的抽象方法后,将该方法交还给父类调用。

0x01. 为啥使用回调?

诚如定义中所言:“回调是一种模式”,既然是模式,肯定是为了解决某一类问题而出现的。那么回调解决了什么问题呢?

这里我们引用一下刘济华老师《漫谈设计模式》一书中买车票回家过节的例子:

小明准备坐火车回家:

而小红离家比较近,她想坐大巴回去,也好办:

细心的你可以发现,两段代码中有相当一部分重复。对于重复代码我们如何去优化呢?是的,使用继承大法。但是,每个人的乘车方式都是不同的,我们无法在基类中作出明确定义,而乘车又是回家过节必需的过程(不考虑离家近的同学步行回家的情况~)。我们只有把乘车方法定义为抽象方法,让各实现类自行决定如何乘车:

这时,公司小秘要统计各位同事怎么回家:

然而公司有位新来的同事,小秘叫不出名字,这咋办?

哈哈,是不是有点熟悉的感觉了?BeiPiao类中的travelling()就是一个回调函数。

其实我们这里还顺带讲了一个设计模式——模板方法模式,父类先定义好模板,具体细节交给子类去实现。

讲了这么多,相信你应该对回调有了近一步的了解,下个小结我们会讲如何在自己的代码中定义回调函数。

0x02. 如何在自己的代码中定义回调?

背景是这样的:最近在看郭霖大神的《第一行代码》,想系统的从头梳理一遍 Android 的基础知识。想着自己做一个 Demo 应用,定义一个 ListView,每个条目对应一个知识点。由于每个条目响应的动作都不同,而我又不想在onItemClickListener()方法中添加无限多个 switch-case 判断。于是我就自定义了一个Func类,该类代表着一个功能点:

自定义接口 OnClickListener 中的action()就是一个回调函数。

Adapter 类中的getView()方法:

我们可以这样添加一个条目:

Talk is cheap, show me the code!

附上GitHub代码地址: LearnFromZero

0x03. 小结

合理利用回调可以使代码易于维护和阅读,就像上面的代码,只需要修改一个地方就可以完成添加 ListView Item 的功能。快动手实现属于你自己的回调吧~

打赏支持我写出更多好文章,谢谢!

打赏作者

打赏支持我写出更多好文章,谢谢!

任选一种支付方式

1 2 收藏 7 评论

关于作者:lovexiaov

Android 测试开发,Python 爱好者,一头扎进 IT 坑,从此踏上不归路~希望国内越来越多的人意识到测试的重要性~ 个人主页 · 我的文章 · 1 ·      

相关文章

可能感兴趣的话题



直接登录
最新评论
  • 半新手。感觉回调这种得相互持有对方的感觉。比如A实现了接口IA,在B中用到了接口IA的某个a方法,比如在B中的有一个地方来调用if(ia!=null)ia.a();。一般由A中
    b.setIAlistener(this)这样才能给B中的ia对象初始化.A想要拿到B中传过来的值。必须持有B对象、有时候不想在A中跟B有什么关联的。只会用广播或者EventBUs之类的处理了

    • lovexiaov   2016/05/15

      之前一直不明白“回调是双向调用”这句话,通过你的讨论理解了,我文中举的回家过年的例子看似不太符合“双向调用”的逻辑,但实际上它既是 A,又是 B,等我整理好后会对文章做一些修改。

  • 夜航船   2016/05/17

    没搞懂这么写代码除了硬靠了个回调概念不知道有什么意义

    也不知道SETNAME和position怎么对应起来

    一个接口里面ACTION 再LIST就行了

     

    • 夜航船   2016/05/17

      回头再看了下 买车票回家过节的例子 难怪·········

      原生的馒头不吃,非得吃人家嚼过的

      • lovexiaov   2016/05/17

        呃,我没看懂你要说什么?

        • 夜航船   2016/05/19

          意思是 设计模式至少有原版翻译的 没必要看解读的 那个例子有多少员工就得写多少类  和车间按产量算工资一样了 难怪活该被叫码农了居然也能出书…

          • lovexiaov   2016/05/19

            原版的不一定是最容易理解的,试问《易经》有多少人能读懂原版?而且这里要讲的重点也不是设计模式,只是为了演示回调而局的例子。“难怪活该被叫码农了居然也能出书…”那您认为什么样的人才能出书呢?

跳到底部
返回顶部