什么是回调方法?

问题描述 投票:24回答:6

我是一个编程新手,不太了解回调方法的概念。试图在Wiki上阅读它,这让我头疼。有人可以简单地解释一下吗?

language-agnostic methods callback
6个回答
21
投票

回调是传递给函数的东西,它告诉函数在操作的某个时刻应该调用什么。函数中的代码决定何时调用函数(以及传递什么参数)。通常,执行此操作的方法是以函数为对象的语言将函数本身传递为“回调”。在其他语言中,您可能必须传递某种特殊的东西,称为“函数指针”(或类似的东西)。否则您可能必须传递函数的名称(然后在运行时进行查找)。

一个简单的例子,在Python中:

void call_something_three_times(what_to_call, what_to_pass_it):
    for i in xrange(3): what_to_call(what_to_pass_it)

# Write "Hi mom" three times, using a callback.
call_something_three_times(sys.stdout.write, "Hi mom\n")

此示例让我们将重复调用函数的任务与实际调用函数的任务分开。这不是很有用,但是可以说明这个概念。

在现实世界中,回调经常用于诸如线程库之类的事情,在该类中,您可以通过描述该线程将要执行的工作的回调来调用某些线程创建函数。线程创建函数完成了建立线程的必要工作,然后安排新线程调用回调函数。


11
投票

Wiki说:

在计算机编程中,回调是对可执行代码的引用,或者一段可执行代码,即作为参数传递给其他代码。这允许较低级别的软件层调用子例程(或功能)在更高级别中定义层。

通俗地说,是一种在需要时通知一段代码即一种方法的机制,即要执行哪段代码即另一种方法。回调与以下事实有关:调用函数的客户端指定了一个函数,该函数属于要执行的调用函数的客户端代码的职责,并将其作为参数传递。GUI中就是一个例子。您将事件发生后(例如按下按钮)和事件发生后调用的函数作为参数传递发生此函数被调用。此功能通常由最初为事件注册的对象实现]


5
投票

回调函数是通过函数指针调用的函数。如果将一个函数的指针(地址)作为参数传递给另一个函数,则当该指针用于调用该函数时,它指向该函数,即表示已进行回调。

为什么要使用回调函数?

回调可用于通知。例如,您需要在应用程序中设置一个计时器。每次计时器到期时,必须通知您的应用程序。但是,time'rs机制的实现者对您的应用程序一无所知。它只需要一个指向具有给定原型的函数的指针,并在使用该指针时进行回调,从而将发生的事件通知您的应用程序。实际上,SetTimer()WinAPI使用回调函数来通知计时器已过期(并且,如果没有提供回调函数,它将在应用程序的队列中发布消息)。


1
投票

回叫意味着您将代码作为参数传递。例如,想象一个按钮,当按下一个按钮时,它会显示一个对话框:

Button testBtn;
testBtn.setOnClickListener(new OnClickListener() {

  @Override
  public void onCLick() {
    JOptionPane.showDialog(testBtn, "Test button pressed");
  }
}

这里,我们告诉按钮要执行的操作,然后单击该按钮。因此,当检测到点击时,框架将执行传递的代码。框架内有一些代码,例如:

void processEvent(Event e) {
  if (e.type == Event.CLICK) {
    e.getComponent().getOnClickListener().onClick();
  }
}

因此,一些基本代码会在发生适当的事件时回调侦听器。

PS:此处为伪代码,请描述一下主意。


1
投票

通常,您提供一个函数作为参数,当某些事情发生时被调用。

在C代码中,您将传递如下所示的内容:

int (callback *)(void *, long );

表示一个函数,它接受两个参数,void *和long,并返回一个整数。

使用面向对象的语言,语法有时更简单。例如,您可能能够构造一种回调机制,该机制允许用户传递看起来像函数或具有抽象方法(因此包装函数)和上下文数据的对象。

现代语言使用术语“委托”来指代功能“模式”。这些可以用作回调。某些语言还使用术语lambda,该术语本质上是一个没有名称的函数,通常在代码块中“即时”创建并作为回调传递。C++11已将这些内容引入其标准。

使用回调的优势在于,您可以将回调与API分离开,即从其调用的API中分离/分离,在某种程度上反之亦然,即尽管在某个地方您知道要调用API, “处理程序”的位置,它不需要知道从哪里调用它。

例如,您可以具有一个API,该API可以生成对象,然后在生成对象时对其进行“回调”。


0
投票

回调方法是在事件发生时被调用的方法

© www.soinside.com 2019 - 2024. All rights reserved.