Подтвердить что ты не робот

Что такое методы обратного вызова?

Я программирую noob и не совсем понимаю концепцию методов обратного вызова. Пытался прочитать об этом в wiki, и это пошло мне на голову. Может ли кто-нибудь объяснить это простым языком?

4b9b3361

Ответ 1

Обратный вызов - это то, что вы передаете функции, которая сообщает ей, что она должна вызывать в какой-то момент своей работы. Код в функции решает, когда нужно вызвать функцию (и какие аргументы передать). Обычно, как вы это делаете, нужно передать самой функции как "обратный вызов", на языках, где функции являются объектами. На других языках вам, возможно, придется передать какую-то особую вещь, называемую "указателем функции" (или аналогичным); или вам может потребоваться передать имя функции (которая затем будет проверена во время выполнения).

Тривиальный пример, в 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")

В этом примере мы отделим задачу повторения вызова функции из задачи фактического вызова функции. Это не очень полезно, но оно демонстрирует концепцию.

В реальном мире обратные вызовы используются для таких вещей, как библиотеки потоков, где вы вызываете некоторую функцию создания потоков с обратным вызовом, который описывает работу, которую будет выполнять поток. Функция создания потока выполняет необходимую работу по настройке потока, а затем упорядочивает функцию обратного вызова, которую будет вызывать с помощью нового потока.

Ответ 2

Wiki говорит:

В компьютерном программировании обратный вызов ссылку на исполняемый код или кусок исполняемого кода, то есть передан как аргумент другому коду. Это позволяет использовать программное обеспечение более низкого уровня для вызова подпрограммы (или функция), определенная на более высоком уровне слой.

В общих чертах, механизм уведомляет кусок кода, то есть метод, какой кусок кода для выполнения, т.е. другой метод, когда это необходимо.
Обратный вызов связан с тем фактом, что клиент вызывающей функции задает функцию, которая принадлежит ответственности клиентского кода вызывающей функции для выполнения, и это передается как аргумент.
Примером может служить графический интерфейс. Вы передаете в качестве аргумента функцию, которая будет вызываться после того, как произойдет событие (например, нажата кнопка), и как только событие эта функция называется. Эта функция обычно реализуется объектом, который был первоначально зарегистрирован для события

Ответ 3

Функция обратного вызова - это функция, вызываемая через указатель функции. Если вы передаете указатель (адрес) функции в качестве аргумента другому, когда этот указатель используется для вызова функции, на которую он указывает, сказано, что выполняется обратный вызов.

Почему вы должны использовать функции обратного вызова?

Обратный вызов может использоваться для уведомлений. Например, вам нужно установить таймер в своем приложении. При каждом истечении таймера ваше приложение должно быть уведомлено. Но разработчик механизма time'rs ничего не знает о вашем приложении. Ему нужен только указатель на функцию с данным прототипом, и при использовании этого указателя он выполняет обратный вызов, уведомляя ваше приложение о произошедшем событии. Действительно, SetTimer() WinAPI использует функцию обратного вызова, чтобы уведомить, что таймер истек (а в случае отсутствия функции обратного вызова он отправляет сообщение в очередь приложений).

Ответ 4

В общем случае вы предоставляете функцию как параметр, который вызывается при возникновении чего-либо.

В коде C вы передадите что-то похожее на это:

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

означает функцию, которая принимает два параметра: void * и long и возвращает int.

С объектно-ориентированными языками синтаксис иногда проще. Например, вы можете создать механизм обратного вызова, который позволяет пользователю передавать объект, который выглядит как функция или имеет абстрактный метод (таким образом, обертывание функции) и контекстные данные.

Современные языки используют термин "делегат" для обозначения функции "шаблон". Они могут использоваться как обратные вызовы. Некоторые языки также используют термин lambda, который по существу является функцией без имени, часто создаваемой "на лету" в блоке кода и передаваемой в качестве обратного вызова. C++11 ввел их в свой стандарт.

Преимущество использования обратного вызова заключается в том, что вы можете выделить, т.е. уменьшить/отделить API от того, что его вызывает, и в некоторой степени наоборот, то есть, хотя в одном месте вы знаете, что звоните в API, на точке "обработчика" ему не нужно знать, откуда он был вызван.

Например, вы можете иметь API, который генерирует объекты, а затем "обратный вызов" по ​​мере их создания.

Ответ 5

Обратный вызов означает, что вы передаете код в качестве параметра. Например, представьте себе кнопку, которая показывает диалоги при нажатии:

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: Pseudocode здесь, просто описывайте идею.

Ответ 6

Метод обратного вызова - это метод, который вызывается при возникновении события