无奈身边没有一本可供参考的书(书到用时方恨少),网上看了一大堆,头疼之外也不知所言正确与否。在此理一下。
弄清楚下面几点:
1.回调函数是什么?
2.回调函数有什么作用?
3.回调函数怎样实现?
1.回调函数是什么?
先看wiki和百度百科
Wiki:在计算机程序设计中,回调函数,或简称回调(Callback),是指通过函数参数传递到其它代码的,某一块可执行代码的引用。这一设计允许了底层代码调用在高层定义的子程序。
非常……高深的样子,简直让人望而却步
百度百科:回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。
嗯,这个比较人性化一点。相信wiki和百度百科还是有一定可信度的吧,只是,还是挺抽象的,那么继续
网上的这么一段解释,在很多地方看到
详细解释:
客户程序C调用服务程序S中的某个函数A,然后S又在某个时候反过来调用C中的某个函数B,对于C来说,这个B便叫做回调函数。例如Win32下的窗口过程函数就是一个典型的回调函数。一般说来,C不会自己调用B,C提供B的目的就是让S来调用它,而且是C不得不提供。由于S并不知道C提供的B姓甚名谁,所以S会约定B的接口规范(函数原型),然后由C提前通过S的一个函数R告诉S自己将要使用B函数,这个过程称为回调函数的注册,R称为注册函数。Web Service以及Java的RMI都用到回调机制,可以访问远程服务器程序。
下面举个通俗的例子:
某天,我打电话向你请教问题,当然是个难题,^_^,你一时想不出解决方法,我又不能拿着电话在那里傻等,于是我们约定:等你想出办法后打手机通知我,这样,我就挂掉电话办其它事情去了。过了XX分钟,我的手机响了,你兴高采烈的说问题已经搞定,应该如此这般处理。故事到此结束。这个例子说明了“异步+回调”的编程模式。其中,你后来打手机告诉我结果便是一个“回调”过程;我的手机号码必须在以前告诉你,这便是注册回调函数;我的手机号码应该有效并且手机能够接收到你的呼叫,这是回调函数必须符合接口规范。
这个详细解释我可以这样翻译么?
通俗解释很感人,但是我还没有跟具体的东东对上号,先看
2.回调函数有什么作用?
回调函数主要用于一些比较费时的操作,或响应不知道何时将会发生的事件,回调函数提供了一种异步的机制,相对于同步执行,提高了效率.
3.回调函数怎么实现?
(1)定义一个回调函数的接口ICallback,里面有一些方法的申明
(2)调用者Caller中声明一个 ICallback对象,并实现它(可在Caller中以内部类的形式,也可另行实现)
(3)当特定条件或事件发生时,调用ICallback的实现中的函数,对事件进行处理。
自定义的接口
public interface ICallback { public void sayHello(); //do something else }
自定义接口的实现
public class Callee implements ICallback{ @Override public void sayHello() { Log.d(Callee.class.getName(), "Callee: Hello World!"); } //do something else }
调用者
public class Caller { private ICallback iCallback; public Caller() { } public Caller(ICallback iCallback) { this.iCallback = iCallback; } public void say1() { iCallback.sayHello(); } public void say2() { Log.d(Caller.class.getName(), "just test");// can be printed new ICallback() { @Override public void sayHello() { Log.d(Caller.class.getName(), "Anonymous inner classes:Hello World!");// can not be // printed } }; } }
Test
public class Test extends TestCase { public void testCallback(){ Caller c = new Caller(); c.say2(); Callee ce = new Callee(); Caller c1 = new Caller(ce); c1.say1(); } }
输出(匿名内部类方式没有输出?!Why?)
写在最后:
所以回调函数到底是什么呢?回调函数就是实现方不调用,而提供给别人(调用者)调用的函数,这一调用会在调用者的某个动作后触发
Android很多回调函数,所以是这个意思吗?(在Activity上有一个按钮,给按钮添加点击事件)
所以上面那个详细解释其实应该这样翻译么?
Activity就是程序C,在Activity的onCreate方法中调用setOnClickListener这个注册函数,程序S暂且称他为系统,在调用onCreate方法后,监听就被注册了,当点击按钮时,就调用方法B,也就是onClick,进行处理
嗯,总感觉只看到调,没有一种回调的感觉,不是应该顾名思义么
参考:
http://heyshadow.blog.163.com/blog/static/57503343200842192115379/
http://www.cnblogs.com/babytrace/archive/2012/04/07/2437125.html
http://www.androidkaifa.com/thread-3677-1-1.html
相关推荐
当某个ContentProvider的数据发生变化时,如增删改数据,ContentObserver会接收到相应的通知,从而触发自定义的回调方法,使应用能够及时更新UI或执行其他相应操作。 1. **ContentObserver的注册与注销**: - 注册...
事件处理是安卓应用交互的关键,笔记通过实例展示了如何监听用户操作,如点击事件,以及如何实现相应的回调函数。此外,还包括了触摸事件和手势识别的处理。 对于数据存储,笔记涵盖了Shared Preferences、SQLite...
4. 接收数据:注册监听器,当有数据到来时,通过onDataReceived()回调函数接收数据。 5. 关闭串口:在完成通信后,必须关闭串口,释放资源。 在笔记本电脑端,通常使用串口通信软件,如Putty或CoolTerm,配置相应的...
5. **网络编程**:讲解如何在Android应用中实现网络请求,如使用HttpURLConnection、OkHttp库,以及如何处理异步任务和网络回调。 6. **服务和服务绑定**:Android服务用于在后台执行长时间运行的任务,课程会介绍...
Activity和Fragment都有明确的生命周期,开发者需要理解各个状态及其对应的回调方法,以确保应用在不同场景下正常运行。 **IntentFilter和启动模式** IntentFilter允许其他应用启动你的Activity或Service,而启动...
### Android App笔记 #### 一、Android概述 **Android** 是一种基于Linux内核的自由及开放源代码的操作系统,主要用于移动设备,如智能手机和平板电脑。它由Google公司和开放手机联盟领导及开发。虽然没有统一的...
通过重写Activity的onCreate()方法,我们可以为组件设置监听器,如OnClickListener,当用户点击组件时触发相应的回调函数。 此外,Android提供了Fragment来处理多屏适配和复杂界面。Fragment是一个可嵌入到Activity...
2. **迁移Activity回调**:当你在Activity中使用Fragment时,通常需要将Activity的部分回调逻辑转移到Fragment的相应回调中。例如,你可以将onCreate()的初始化逻辑移到Fragment的onCreate()中,将与视图创建相关的...
onCreate用于初始化设置,onStart和onResume使得Activity变为可见和运行状态,onPause和onStop分别表示Activity不再可见和停止,而onDestroy则是Activity被销毁前的回调。在Android系统内存不足时,处于onPause和...
4. 处理用户交互:当用户在设置界面中进行选择时,可以通过重写Preference的onPreferenceChange()或onPreferenceClick()回调来响应用户操作。 在源码层面,PreferenceActivity会解析xml布局文件并创建相应的...
事件处理和回调函数也是Android开发的重要部分。你将了解如何响应用户交互,如点击事件,并学会使用OnClickListener等接口。同时,笔记还会涉及异步操作,如AsyncTask和IntentService,这对于处理耗时任务和避免阻塞...
开发者可以通过实现或继承特定的接口,如OnClickListener、OnTouchListener,来注册事件监听器,并在对应的回调方法中编写处理逻辑。 4. **数据存储**:Android提供了多种数据存储方式,包括Shared Preferences...
在使用WebView时,开发者需要设置WebView的基本属性,如设置WebChromeClient和WebViewClient,这两个类分别处理网页加载过程中的各种回调事件,比如进度条显示、网页加载完成等。同时,为了安全考虑,还需要启用...
- **`onActivityResult()`**:碎片可以像活动一样处理`startActivityForResult()`,并接收`onActivityResult()`回调。 - **`setArguments(Bundle)`** 和 **`getArguments()`**:用于在碎片创建时传递数据。 - **`...
- 回调机制,如通过接口定义回调函数。 - 使用`EventBus`等发布订阅模式的库。 - 发送广播。 - 注册`ContentObserver`内容观察者。 - 将数据存储到本地文件后,Activity读取文件。 #### Handler机制 - **Handler的...
Service简介,服务就是没有任何界面,不需要和用户直接打交道且需要长时间在后台运行的程序。例如手机中的音乐播放服务、天气更新服务和下载服务等。 服务运行在主线程中的,为了不让主线程阻塞,所以要在服务内部...
本篇将详细探讨如何实现“Android笔记之图片自由裁剪DEMO”,并结合提供的`ImageCutDemo`来深入理解相关知识点。 1. **Intent选择图片** Android系统提供了Intent机制,用于启动系统服务或与其他应用程序进行交互...
包含`onPreExecute()`, `doInBackground()`, `onProgressUpdate()`, `onPostExecute()`等回调方法。 以上内容仅是安卓开发中的冰山一角,深入学习还包括事件监听、动画、自定义View、数据绑定、网络请求、数据库...