在计算机程序设计中,回调函数,或简称回调(Callback 即call then back 被主函数调用运算后会返回主函数),是指通过函数参数传递到其它代码的,某一块可执行代码的引用。这一设计允许了底层代码调用在高层定义的子程序。(维基百科)
C的回调
在C/C++中,回调函数是一个通过函数指针调用的函数,当你把函数的指针作为参数传递给另外一个函数。当这个指针被用来调用其所指向的函数时,我们称这样的函数为回调函数。
实用情况举例:
1. 假设要编写一个库,其中提供了某些排序算法。(如冒泡排序,快速排序,shell排序,shake排序等),为了使库通用,我们不想在排序算法函数体内嵌入排序逻辑,并且想使该算法支持多种数据类型。此时就可以使用函数指针,进行回调。
2.回调还可以用于通知机制。
Java的回调
接口通常被使用在Java编程语言,用来做回调函数使用 。Java并不允许方法作为参数传递使用,因此,其中一个解决办法则是可以定义一个接口,把这个接口当成方法的参数,以此来使用该项对象的方法签名。
实现原理:
首先创建一个回调对象,然后再创建一个控制器对象,将回调对象需要被调用的方法告诉控制器对象。控制器对象负责检查某个场景是否出现或某个条件是否满足。当此场景出现或此条件满足时,自动调用回调对象的方法。
以android的SoundRecorder举例。
1. 定义一个相关的接口
//回调接口 public class Recorder implements OnCompletionListener, OnErrorListener { public interface OnStateChangedListener { public void onStateChanged(int state); public void onError(int error); } }
2. Class A实现接口 interface 中的callback 方法。
//SoundRecorder类对接口进行实现 public class SoundRecorder extends Activity implements Recorder.OnStateChangedListener { public void onError(int error) { Resources res = getResources(); boolean isExit = false; String message = null; switch (error) { case Recorder.SDCARD_ACCESS_ERROR: message = res.getString(R.string.error_sdcard_access); break; case Recorder.INTERNAL_ERROR: message = res.getString(R.string.error_app_internal); isExit = true; break; case Recorder.UNSUPPORTED_FORMAT: message = res.getString(R.string.error_app_unsupported); isExit = true; break; } }
3. Class B中有一个以接口为参数的方法。
public void setOnStateChangedListener(OnStateChangedListener listener) { mOnStateChangedListener = listener; } OnStateChangedListener mOnStateChangedListener = null; //引用回调对象
4. Class A中的对象调用Class B中的该方法。
class SoundRecorder public void onCreate(Bundle icycle) { mRecorder = new Recorder(); mRecorder.setOnStateChangedListener(this);//传入回调对象 }
5. 然后当某些情况发生后,Class B通过callback的方式调起Class A中实现的接口方法。
class Recorder >> 1. public void startRecording(int outputfileformat, String extension, Context context, int audiosourcetype, int codectype) { try { mRecorder.setAudioEncoder(codectype); } catch(RuntimeException exception) { setError(UNSUPPORTED_FORMAT); mRecorder.reset(); mRecorder.release(); if (mSampleFile != null) mSampleFile.delete(); mSampleFile = null; mSampleLength = 0; mRecorder = null; return; } } 2. private void setError(int error) { if (mOnStateChangedListener != null) mOnStateChangedListener.onError(error); }
以上分析如有错误,请指正。
时间: 2024-11-07 19:12:53