码迷,mamicode.com
首页 > 编程语言 > 详细

了解java回调函数

时间:2015-10-05 18:03:10      阅读:208      评论:0      收藏:0      [点我收藏+]

标签:

    在计算机程序设计中,回调函数,或简称回调(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);
    }


}
View Code

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;
        }
}
View Code

3. Class B中有一个以接口为参数的方法。

技术分享
    public void setOnStateChangedListener(OnStateChangedListener listener) {
        mOnStateChangedListener = listener;
    }
  OnStateChangedListener mOnStateChangedListener = null; //引用回调对象
View Code

4. Class A中的对象调用Class B中的该方法。

技术分享
class SoundRecorder

public void onCreate(Bundle icycle) {
        mRecorder = new Recorder();
        mRecorder.setOnStateChangedListener(this);//传入回调对象
}
View Code

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);
    }
View Code

 

 以上分析如有错误,请指正。

 

了解java回调函数

标签:

原文地址:http://www.cnblogs.com/item-notpeople/p/4855807.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!