了解java回调函数

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

了解java回调函数的相关文章

Java回调函数详解

为了了解什么是回调函数,在网上查阅了如下资料,整理如下: 资料一: 首先说说什么叫回调函数? 在WINDOWS中,程序员想让系统DLL调用自己编写的一个方法,于是利用DLL当中回调函数(CALLBACK)的接口来编写程序,使它调用,这个就 称为回调.在调用接口时,需要严格的按照定义的参数和方法调用,并且需要处理函数的异步,否则会导致程序的崩溃. 这样的解释似乎还是比较难懂,这里举个简 单的例子: 程序员A写了一段程序(程序a),其中预留有回调函数接口,并封装好了该程序.程序员B要让a调用自己的程

一个简单的java回调函数的实现

回调函数 回调函数涉及的3个函数 登记回调函数 回调函数 响应回调函数 简单的解释 你到一个商店买东西,刚好你要的东西没有货,于是你在店员那里留下了你的电话,过了几天店里有货了,店员就打了你的电话,然后你接到电话后就到店里去取了货.在这个例子里,你的电话号码就叫回调函数,你把电话留给店员就叫登记回调函数,店里后来有货了叫做触发了回调关联的事件,店员给你打电话叫做调用回调函数,你到店里去取货叫做响应回调事件.回答完毕.来自知乎点击打开链接 代码的实现 首先有一个接口 interface CallB

java回调函数机制

Java回调函数机制 参考了网上的一些资料,下面也做出一些总结,供初学者了解学习. 一. 概述 软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用.回调.异步调用 . 同步调用:一种阻塞式调用,调用方要等待对方执行完毕才返回,它是一种单向调用: 回调:一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口: 异步调用:一种类似消息或事件的机制,解决了同步阻塞的问题,它的调用方向刚好相反,接口的服务在收到某种讯息或发生某种事件时,会主动通知客户方(即调用客户

Android(java)回调函数经典示例

回调函数经典示例 1.使用java回调函数来实现一个测试函数运行时间的工具类 public class TestObject { /** * 一个用来被测试的方法,进行了一个比较耗时的循环 */ public static void testMethod(){ for ( int i= 0 ; i< 100000000 ; i++){ } } /** * 一个简单的测试方法执行时间的方法 */ public void testTime(){ long begin = System.current

Java回调函数的理解与实现

回调函数,或简称回调,是指通过函数参数传递到其它代码的,某一块可执行代码的引用.这一设计允许了底层代码调用在高层定义的子程序. 在Java里面,我们使用接口来实现回调.举个例子 所谓的回调,就是程序员A写了一段程序(程序a),其中预留有回调函数接口,并封装好了该程序.程序员B要让a调用自己的程序b中的一个方法,于是,他通过a中的接口回调自己b中的方法. 举个例子: 1.  首先定义一个类Caller,按照上面的定义就是程序员A写的程序a,这个类里面保存一个接口引用. public class C

转Java 回调函数的理解

所谓回调,就是客户程序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都用到回调机制,可

Java回调函数的理解

所谓回调,就是客户程序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都用到回调机制,可

Java 回调函数

回调函数 我对回调函数的理解 假设: 我的车在家里,现在已经坏了,我打电话给万能的维修工,我告诉他,嘿!哥来帮我修一下我的车吧!但是,维修工告诉我没有现在空闲,等有空闲了我可以上门服务!我告诉维修工如果你有空了那么你就直接来我家给我修理吧. 换成程序而言: 如果我想让一个类,调用我自己声明的方法,那么我需要一个一个回调接口来让我自己的类去实现它.通过这样来实现回调函数.回调函数就好像是C#中的委托.Java中并没有类似的机制.可以利用接口来实现回调. 下面是一个小的Demo: 下面是一个简单的类

JAVA回调函数ANDROID中典型的回调地方

在计算机中回调函数是指通过函数参数传递到其他代码类的,某一块可执行代码的引用,这以设计允许了底层代码调用者在高层定义的子程序. 在JAVA里面我们使用接口的方式来实现函数的回调. 回调的通俗就是:程序员阿祥写了一段程序(CallPerson)其中有回调函数的接口(PhoneCall),并且封装好了程序(CallPerson).程序员阿呆写了程序(MumCall)要让 阿祥写的程序(CallPerson)调用阿呆写的程序(MumCall)中的方法.于是阿祥的程序(CallPerson)通过程序中(