2015 July 23

Android接口回调小结

回调机制:根据Button事件的注册机制分析,理解,其实往往看似最简单的事物中蕴含着最深入的道理。

最开始看到说是接口回调,自己想了好久懵懵懂懂,似懂非懂,看了一些资料之后,发现是如果说是接口函数回调,那么很多东西就好理解的多了,回调的是函数,接口只是一个Java中传递函数的媒介。在C语言之中直接传入函数地址也是可以实现回调的,所以说Java接口回调的本质是函数回调。

先上一段最典型的代码:

class Activity{
View mButton;

mButton.setOnclickListener(new ButtonClick());

private class ButtonClick impliment OnclickListener {
    public onClick(View v){
            //Do Something what you want
}
}
}

当然一般我们写接口实现匿名内部类,这里写全是为了更加能够看清本质。那么在View中,当然有对应的一些接口:

class View {
    
    private OnclickListener mListener;
    public interface OnclickListener{
        pulic onClick(View v);
    }

    public setOnclickListener(OnclickListener listen){

            mListener = listen;
    }
}

说白了,接口回调是什么回事呢,就是View类想完成某个事件,这里当然是点击事件,但是缺少材料想找别人借材料,完成自己的事,那么一借东西,二者的联系就建立起来了,这里就完成了相应的组件通信。在这里View想完成点击事件,但是点击之后发生什么呢?自己不知道,缺东西啊,找Activity借,Activity定义了具体的如何去做,这个如何去做封装到一个函数里面借给View,view然后回调这个函数,就完成了事件了。

另一个简单的比喻:某人要到商店买东西,但是商店没货了,就跟顾客说你留下一个合适的方式到货了我告诉你。也就是商店想跟顾客建立相应的联系。

顾客说,我有手机联系方式和Email联系方式,这样吧到货了你打我电话。也就是打电话这个具体的动作是顾客定义的,指定的,也就是商店到时候要回调的函数方法,是顾客自己定义的。

这个比喻中回调做的什么呢?回调做的是:当某些条件满足的时候在(到货的时候),商店想要通知顾客,但是商店缺东西啊,缺什么呢?缺打顾客联系方式这个函数,然后顾客自己告诉他了,等到到货了,商店就回调顾客提供的这个函数。

CallBack

如图中所示,ClassA的执行过程中缺失了部分逻辑,这部分逻辑的填充式用ClassA中的接口方法填充,ClassB通过某种方式一般是实现接口再Set给ClassA,那么A在执行过程中所调用的函数实际就成了B已经实现过的具体的函数,在函数内部B可以给予其部分自己所具有的信息,这样AB的交互就完成了。

这就是回调!

当然,细分的话,回调还分为同步回调和异步回调,异步回调更多的是一种异步消息传递机制,当某种条件满足时,发送消息通知客户的机制,客户接受到消息之后继续完成其逻辑,顾客买东西的比喻就是典型的异步回调,到货了,商店通知客户,客户收到消息来到商店继续买东西。而前者的View事件则是同步回调,也就是简单的互相调用模式,被调用方在接口被调用时也会调用对方的接口,但是这个过程是阻塞的,回调结束就得到结果结束整个回调过程,相反异步回调结束之后还不能得到结果,调用方被解放出来不必苦苦等待,调用的结果服务方之后通知,在等待通知这个过程的时间可以被充分利用去干其他事,这是最大的差别。

以下引用知乎回答:

编程分为两类:系统编程(system programming)和应用编程(application programming)。所谓系统编程,简单来说,就是编写库;而应用编程就是利用写好的各种库来编写具某种功用的程序,也就是应用。系统程序员会给自己写的库留下一些接口,即API(application programming interface,应用编程接口),以供应用程序员使用。所以在抽象层的图示里,库位于应用的底下。

当程序跑起来时,一般情况下,应用程序(application program)会时常通过API调用库里所预先备好的函数。但是有些库函数(library function)却要求应用先传给它一个函数,好在合适的时候调用,以完成目标任务。这个被传入的、后又被调用的函数就称为回调函数(callback function)。

根据该知乎引用中所额外指出的:ABC三方,A起始函数,B-API函数也就是中间函数,C是回调函数。AC位于同一层面,而API中间函数是底层事件。


###quote

知乎-回调参考1

知乎-回调参考2

知乎-怎样理解阻塞非阻塞与同步异步的区别

这一段讲的太好了,想了下还是决定直接全文引用贴出来:

“阻塞”与”非阻塞”与”同步”与“异步”不能简单的从字面理解,提供一个从分布式系统角度的回答。

  • 同步与异步 同步和异步关注的是消息通信机制 (synchronous communication/ asynchronous communication) 所谓同步,就是在发出一个调用时,在没有得到结果之前,该调用就不返回。但是一旦调用返回,就得到返回值了。 换句话说,就是由调用者主动等待这个调用的结果。

而异步则是相反,调用在发出之后,这个调用就直接返回了,所以没有返回结果。换句话说,当一个异步过程调用发出后,调用者不会立刻得到结果。而是在调用发出后,被调用者通过状态、通知来通知调用者,或通过回调函数处理这个调用。

典型的异步编程模型比如Node.js

  • 举个通俗的例子:

你打电话问书店老板有没有《分布式系统》这本书,如果是同步通信机制,书店老板会说,你稍等,”我查一下”,然后开始查啊查,等查好了(可能是5秒,也可能是一天)告诉你结果(返回结果)。 而异步通信机制,书店老板直接告诉你我查一下啊,查好了打电话给你,然后直接挂电话了(不返回结果)。然后查好了,他会主动打电话给你。在这里老板通过“回电”这种方式来回调。

  • 阻塞与非阻塞

阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态. 阻塞调用是指调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回。 非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程。

还是上面的例子, 你打电话问书店老板有没有《分布式系统》这本书,你如果是阻塞式调用,你会一直把自己“挂起”,直到得到这本书有没有的结果,如果是非阻塞式调用,你不管老板有没有告诉你,你自己先一边去玩了, 当然你也要偶尔过几分钟check一下老板有没有返回结果。 在这里阻塞与非阻塞与是否同步异步无关。跟老板通过什么方式回答你结果无关。

上一篇
下一篇
Loading Disqus comments...
Table of Contents