回调这种思想大家应该都用过,只是很多人不知道那是回调的一种罢了,前几天整理了一下自己对于回调的理解,就顺便把自己的一些想法整理到博客中。
让我们从一个小故事开始。
某天,我打电话向你请教问题,当然是个难题,你一时想不出解决方法,我又不能拿着电话在那里傻等,于是我们约定:等你想出办法后打手机通知我,这样,我就挂掉电话办其它事情去了。过了XX分钟,我的手机响了,你兴高采烈的说问题已经搞定,应该如此这般处理。
OK,这个故事我们先告一段落,其实,这就是一个典型的回调过程。
C不会自己调用b,C提供b的目的就是让S来调用它,而且C不得不提供。S并不知道C提供的b是什么,因此S会约定b的接口规范(函数原型),然后由C提前通过S的一个函数r告诉S自己将要使用b函数(即注册)。r为注册函数。
简单来说:
回调函数就是预留给系统调用的函数,而且我们往往知道该函数被调用的时机
好的,那我们继续完善下上面的那幅图。
看着这幅图,其实我们回想一下,会发现,生活中到处都有回调这种思想存在。软件的很多思想其实只是我们实际生活中思维方式的一种转化。
再将一个小故事:
我们平时考试答题的第一件事是干嘛?没错,是写上学号和姓名。这里注意了,我们填写学号和姓名不是给自己看的(即该方法不是给自己调用的),而是给老师登记分数时看的(预留给系统将来调用),这其实就是一个回调的应用。老师提供接口(输入姓名,学号规则),我们利用接口注册。
看到上面的小故事,大家对回调就有了一些了解了,我们再回到开头的那个小故事。
那个故事说明了“异步+回调”的编程模式。其中,你后来打手机告诉我结果便是一个“回调”过程;我的手机号码必须在以前告诉你,这便是注册回调函数;我的手机号码应该有效并且手机能够接收到你的呼叫,这是回调函数必须符合接口规范。
好的,我们已经大概知道了回调的基本流程,下面,来看看Android中回调的基本使用。
场景一:
- Button button = (Button)this.findViewById(R.id.button);
- button.setOnClickListener(newButton.OnClickListener() {
- //回调函数
- @override
- publicvoidonClick(View v) {
- buttonTextView.setText("按钮被点击了");
- }
- });
上面的代码给按钮加了一个事件监听器,这其实就是“回调”最常见的应用场景之一。我们自己不会显式地去调用onClick方法。用户触发了该按钮的点击事件后,它会由Android系统来自动调用。
熟悉的组件,熟悉的监听器。。。
场景二:
- @Override
- publicvoidonCreate(BundlesaveInstanceState) {
- super.onCreate(saveInstanceState);
- // You code...
- }
- @Override
- publicvoidonResume() {
- super.onResume();
- // You code...
- }
Activity的整个生命周期基本上都说回调函数在发挥作用。
好了,看了两个我们经常使用的回调方式,我们先来总结下android利用回调的基本方法。其实,只是把我们的那张图翻译了下。
首先,服务器端创建一个回调接口
- //声明一个接口
- public interface ICallBack {
- void postExec();
- }
- //另外一个类有方法里面有个参数是这个接口类型的对象
- public class FooBar {
- private ICallBackcallBack;
- public void setCallBack(ICallBackcallBack) {
- this.callBack =callBack;
- }
- public void doSth() {
- callBack.postExec();
- }
- }
- //实现回调
- public class Test {
- public static void main(String[] args) {
- FooBarfoo = newFooBar();
- foo.setCallBack(newICallBack() {
- public void postExec() {
- System.out.println("method executed.");
- }
- });
- foo.doSth();//调用函数
- }
- }
对回调的深入思考:
程序的本质就是代码跳转,不管同步异步反射接口虚函数,本质上都是函数调用。函数我们要调用它,就需要它的指针,不同语言通过不同的方式来得到这个指针。而我们定义的接口其实就是一个函数指针,那么那个注册过程,其实就是相当于对那个函数指针赋值。通过这个函数指针来调用我们定义的自实现函数。利用函数指针实现回调,在RIL的C代码中无处不在,大家可有空研习。
相关推荐
所有的请求都是独立在UI主线程之外,没有通过CommCallback回调方法处理请求结果, 没有了子线程、没有了handle,链式的变成使得代码更加清晰 。博客地址:http://blog.csdn.net/dickyqie/article/details/54879807
android startActivityForResult实现Acitvity的回调 最常见的登录运用.
以前开发Android,与很多地方需要用到异步网络请求,当然这方面很多现成的框架可以用,但是B/S上...其实就通过加线程池然后再写一个回掉函数,根据返回的结果调不同的函数。 使用方法,直接LHttp.get 活LHttp.post等等
文档代码演示了android底层库回调上层应用,实现的原理就是先通过android的JNI指针调用底层接口,然后在通过指针调用实现底层调用上层接口。 我们在使用的时候,根据库的性质,需要在androidmanifest.xml 里面设置...
封装了okhttp的网络框架,支持大文件上传下载,上传进度回调,下载进度回调,表单上传(多文件和多参数一起上传),链式调用,可以自定义返回对象,支持Https和自签名证书,支持cookie的持久化和自动管理
Android调用海康威视SDK实现网络实时播放.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
一个Android事件分发中心库,基于对象池及接口回调实现。实现类似BroadcastReceiver/RxBus/EventBus等的消息事件传递功能,用于在Activity/Fragment/Service之间的消息传递通讯。
对Okttp的Get请求的简单封装,处理了网络回调的线程切换
在 iOS开发中有大名鼎鼎的AFNetworking库,用来处理网络请求操作,今天要介绍的是一个在Android上同样强大的网络请求库android-async-http,此库的网络处理均基于Android的非UI线程,通过回调方法处理请求结果。...
一个基于Httpclient的网络异步操作框架。数据请求被封装在一个回调形式的方法中。
2 一行代码发送请求,提供多种回调函数供选择, 3 支持8种网络请求方式 GET,POST,PUT,DELETE,HEAD,OPTIONS,TRACE,PATCH 4 支持请求的优先级设置,优先级高的将先于优先级低的发送请求 5 支持取消请求,可以...
咔咔缓存(KakaCache) > 咔咔一声,缓存搞定。这是一个专用于解决Android中网络请求及图片加载的缓存处理框架 项目目标 本项目是作为实验项目,不保证其稳定性及可靠性 ...支持异步执行,UI线程回调 自
支持文件请求、上传、下载的进度回调、错误回调,也可以自定义回调。 支持任意数据结构的自动解析。 支持添加动态参数例如timeStamp时间戳、token、签名sign。 支持自定义的扩展API。 支持多个请求合并。 支持Cookie...
Socket长连接、通信、心跳包、消息回调、Java服务端
网络变化时系统会发出广播。通过监听这个广播,利用接口回调通知activity做相应的操作。判断网络状态
Android异步加载网络图片(线程),采用LruCache算法,使用线程回调接口,实现异步加载网络图片
MVP模式,MVP所对应的意义:M-Model-模型、V-View-视图、P-Presenter-表示器。 博客地址:http://blog.csdn.net/dickyqie/article/details/54894396
app统一调用该层接口和这层提供的回调,该层可以切换不同的网络请求库. 网络请求库封装层. 封装了开源的Android网络请求库请求对外提供的方法. 胶水层.负责调用层和封装层的连接.调用网络封装层的接口并将返回...
HTTP网络通信工具类(ToolHTTP.java),get/post请求,支持多种接口回调 SOAP协议通信工具类(ToolSOAP.java),基于异步回调请求WebService接口 Sqlite数据库操作工具类(ToolDatabase.java),获取DAO、创建表、删除...
只需指定文件名和文件地址,下载路径,就可进行多线程网络下载,并且,能够自定义通知栏信息,显示下载进度,通过回调,显示下载成功或失败两种情况。