初看回调
【2020年5月9号 23:33:00】五一小长假后的一周,做的项目,终于测试完成,明天能稍微歇歇了。
0. interface
(1) 接口是一种规范,例如,电脑的USB接口。设计电脑的人不用关心用户将会把什么东西插到USB接口上,同样,设计手机数据线的人也不用考虑用户将会把手机的数据插到什么牌子的电脑上,但是唯一需要设计者在乎的是,他们都必须要遵从某个协议。这样子,我们使用者就能将任何数据线和任何牌子的电脑相连接,并能进行数据的传递了。
我觉得这就是要在回调中使用接口的原因了,因为你在写注册的方法时候,你并知道谁会去调用用接口中的方法,也不需要知道调用者是如何具体实现接口中的方法的,你要做的就是,规定好,当满足条件后,调用这个方法即可。
(2) 接口是Java中一种重要的数据类型,用接口声明的变量称之为接口变量,如,List<?> mList = new ArrayList<>(); 这里的mList就是接口变量。接口属于引用变量,接口变量中可以存放实现该接口的类的实例的引用,即存放对象的引用,如,private ICallback mCallback = new ICallback() {…},mCallback中存放的就是实现ICallback接口的类的实例的引用【 这里使用的是,创建接口的匿名实现类的非匿名对象】1. 回调
(1) 定义: 回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。
链接🔗: 百度百科–回调函数
说白了就是,A类调用B类中的c()方法,然后B类再反过来调用A类中的d()方法。反过来调用方法d()的这一步,就叫作调用回调接口。
(2) 什么时候使用回调
回调一磅用于不同层次间的相互协作,在上层代码中,将这一层的函数放到下层中(这个函数就是回调函数),而在下层中,当满足某一条件的时候,这个回调函数会被触发。(所谓的下层代码可以认为是底层代码,就是开发者已经写死的代码,上层的代码,是说交给使用者,使用者可以根据具体的情况进行修改)
举个栗子:
出门旅游住宾馆,宾馆可能会提供早晨叫醒服务,宾馆可以看成是下层(底层),宾馆已经存在叫醒服务。客人可以看作是上层,客人只需要去前台预订一下叫醒服务,转天就能收到叫醒服务 (3) 实现步骤 step1: 定义回调接口ICallback
step2: 在class A中实现回调接口ICallback,同时持有class B的对象b
step3: 在class B中有一个含有参数类型为ICallback参数的方法c(ICallback callback)
step4: 由于class A持有class B的对象,所以class A可以调用class B的方法c(arg0),并将ICallback接口的引用作为参数传进来
step5: 然后b就可以在方法c(arg0)执行完毕后,调用class A中的方法d()
2. 代码
输出:
旅客预定了叫醒服务…
一宿过去了, 天亮了…
被叫醒了…
说明
class A相当于class Customer,class B相当于class Hotelstep1: 在Customer类 中定义回调接口IWakeUpServiceCallback,接口中定义了一些方法。
step2: Customer类 实现回调接口IWakeUpServiceCallback,同时持有Hotel的对象
step3: 在Hotel类 中有一个registerWakeUpService(IWakeUpServiceCallback callback)方法,参数是IWakeUpServiceCallback接口类型
step4: 由于Customer类持有Hotel的对象,所以Customer可以调用Hotel的registerWakeUpService(arg... )方法,并将IWakeUpServiceCallback接口的引用作为参数传进来
step5: 在Hotel类中,调用回调方法 wakeUpService()
注: 这里不一定要定义一个register注册的方法,也可以是一个构造器,同样可以将接口的引用传进来。
在Android中涉及大量的回调,包括Android自带的点击监听事件、动画的开始结束监听事件…,还有自定义的一些事件监听器。
【TODO】目前我看好多回调接口都是写在一个class的内部,不知道这是个人习惯问题还是有一些其它的设计方式。不过看到《Thinking in Java》中提到了内部类和闭包的问题。看来明天还要抽时间再研究一下。(未完.... ...待续)
============================== 分割线 ==============================
markdown好像还没有语法高亮?写的代码都一个颜色的,看着有点不太习惯。于是在carbon上写完代码,把代码直接粘过来了。