Обратные вызовы определены в Википедии как:
В компьютерном программировании функция обратного вызова относится к ссылке на определенную часть исполняемого кода, которая передается другому коду через параметры функции.
Цель состоит в том, чтобы позволить базовому коду вызовать подпрограммы, определенные на более высоком уровне.
Например, это может быть более ясным: использование модернизации для сетевых запросов в Android В качестве примера это является примером асинхронных обратных вызовов.
После начала сетевого запроса приложение может продолжать другие вещи. Результат сетевого запроса обычно получается с помощью двух методов ответа и Onfailure. Взгляните на код в соответствующей части:
call.enqueue (новый обратный вызов <istorybean> () {@Override public void onResponse (call <vistorybean> call, ответ <astorybean> response) {astorybean hb = response.body (); if (hb == null) return; showtext.append (hb.iserror () + "); showtext.append (rb.getTitle () + "/n");Игнорируйте дженерики в обратном вызове выше. Согласно определению в Википедии, весь код в анонимном внутреннем классе может рассматриваться как ссылка на определенный исполняемый код, который передается другим кодам . Два метода ответа и настройки являются методами обратного вызова. Базовый код - это не изменяемая часть сетевого запроса, которая была записана, а подпрограмма, определенная более высоким уровнем, является обратным вызовом. Поскольку конкретная реализация передается пользователю, она обладает высокой гибкостью. Приведенное выше связано с помощью метода Enqueue (обратный вызов).
Шаги метода обратного вызова
Вызовов, упомянутый выше, является очень распространенной концепцией. Если вы поместите это на написание программы, вы можете сказать:
В классе A метод C в классе B называется, а затем в классе B, метод D в классе A вызывается в обратном направлении. D - метод обратного вызова. Класс B является базовым кодом, а класс A-код высокого уровня.
Таким образом, благодаря вышеупомянутому объяснению, мы можем что -то сделать. Чтобы представить универсальность метода D, мы используем форму интерфейса для создания метода D, называемого методом интерфейса. Если класс B хочет позвонить в метод D в классе A, то класс A должен реализовать этот интерфейс. Таким образом, в зависимости от реализации, будет полиморфизм, что делает метод гибким.
Если класс A хочет вызвать метод C в классе B, то класс A должен содержать ссылку на B, в противном случае он не будет вызван. Этот шаг называется интерфейсом регистрации. Итак, как реализовать метод обратного вызова D в классе A в классе B, непосредственно через метод выше C. Метод C в классе B принимает параметр типа интерфейса. Затем, только в методе C, вам необходимо использовать параметры этого типа интерфейса, чтобы вызовать метод D в классе B, который, в свою очередь, вызывает метод D в классе A. Этот шаг называется вызовом интерфейса обратного вызова.
Это также реализует, что в методе C класса B метод D в классе A должен быть вызван в обратном направлении, который является обратным вызовом. Вызовы B для непосредственной настройки, которые можно рассматривать как использование базового API для кода высокого уровня. Мы часто пишем такие программы. B вызывает A, чтобы вызовать, и базовый API требует выполнения кода высокого уровня.
Наконец, давайте обобфрим шаги метода обратного вызова:
Пример обратного вызова
Давайте возьмем сына, играющего в игры, ожидая, когда его мать подготовит еду и уведомим его сына прийти и есть в качестве примера, и выполните вышеуказанные шаги, чтобы написать обратный вызов;
В приведенном выше примере очевидно, что сын должен реализовать интерфейс обратного вызова, а мать должна вызвать интерфейс обратного вызова. Итак, мы сначала определяем интерфейс обратного вызова, а затем позволили нашему сыну реализовать этот интерфейс обратного вызова.
Код заключается в следующем:
обратный вызов публичного интерфейса {void eat ();} Son Public Class Son реализует обратный вызов {частная мама; // класс A содержит ссылку на Public void setmom класса B (мама) {this.mom = mom; } @Override public void eat () {System.out.println («Я здесь, чтобы поесть»); } public void askmom () {// вызов метода с параметрами интерфейса посредством ссылки на класс B. System.out.println ("Была ли приготовлена блюда?"); System.out.println («Не закончил, я играю в игру»); Новая тема (() -> mom.docook (son.this)). start (); System.out.println («Игра в игру ...»); }}Тогда нам также необходимо определить класс матери, который содержит метод, рассказанный с параметрами интерфейса
Общедоступный класс мама {// вызовет метод обратного вызова, используя параметры интерфейса в методе, содержащем параметры интерфейса public void void run () {try {system.out.println ("cooking ..."); sleep (5000); e.printstacktrace ();}}}). start (); }}Мы проходим тестовый класс:
открытый тест класса {public static void main (string [] args) {mom mom = new Mom (); Сын, сын = новый сын (); Son.setmom (мама); Son.askmom (); }}Этот пример является типичным примером обратного вызова. Класс Сына реализует метод обратного вызова интерфейса. Он вызывает Docook в классе MOM через метод Askmom, чтобы зарегистрировать интерфейс обратного вызова, который эквивалентен вызова кода C класса B в классе A. Docook в классе мамы в классе назад и вперед класс Eat in the Son, чтобы рассказать результатам в классе Son.
Таким образом, мы реализуем простой, определенный обратный вызов.
Дальнейшее исследование примеров обратного вызова
Давайте в основном посмотрим на код класса сына:
Son Public Class Son реализует обратный вызов (Public Mom Mom; общественный сын (мама мама) {this.mom = мама; } public void askmom () {System.out.println ("Была ли приготовлена еда?"); System.out.println («Я плохо это сделал, я играл в игру»); Новая тема (() -> mom.docook (son.this)). start (); System.out.println («Я играю в игру ...»); } @Override public void eat () {System.out.println («Хорошо, я здесь, чтобы поесть»); }}В этом классе, в дополнение к выводу некоторых утверждений, действительно полезными частями являются Mom.docook (Son.this) и переписывание метода eat. Поэтому мы можем сократить этот обратный вызов через форму анонимного внутреннего класса. Код заключается в следующем:
открытый класс callbacktest {public static void main (string [] args) {mom mom = new mom (); новая поток (() -> mom.docook (() -> system.out.println («У меня была еда ...»))). start (); }}Отмените класс Son и напрямую реализуйте метод EAT через анонимный внутренний класс в основном методе. На самом деле, анонимные внутренние классы являются воплощением обратных вызовов.
Асинхронные обратные вызовы и синхронные обратные вызовы
Обратный вызов: метод вызовов C в классе B, а затем вызовы D -метод D в объектах класса A через класс A в методе C.
Давайте поговорим об асинхронной и синхронизации, давайте сначала поговорим о концепции синхронизации.
синхронно
Синхронизация означает, что при вызове метода, если предыдущий вызов метода не выполняется, не может быть сделан новый вызов метода. Другими словами, все должно быть сделано один за другим, и вы можете сделать только следующее.
асинхронный
Асинхронность относится к синхронизации, вам не нужно ждать, пока предыдущий вызов метода не будет завершен, прежде чем вызовать новый метод. Следовательно, в асинхронных вызовах метода необходим метод, чтобы уведомить пользователя о результате вызова метода.
Внедрить асинхронные методы
Наиболее распространенный способ реализации асинхронного в Java - это позволить методу, который вы хотите выполнить асинхронно в новом потоке.
Мы обнаружим, что метод необходим в асинхронном вызове метода, чтобы уведомить результат вызова пользователя. Основываясь на вышеизложенном, мы обнаружим, что метод обратного вызова подходит для этого, и уведомим пользователя результата вызова с помощью метода обратного вызова.
Асинхронный обратный вызов выполняется в новом потоке, когда метод вызовов C из B.
Приведенный выше пример того, как мать уведомила ее сына на ужин, является примером асинхронного обратного вызова. В новой ветке вызывается метод Docook, и возвращаемое значение, наконец, принимается через EAT. Конечно, после использования оптимизации Lamdba сущность такая же.
Синхронный обратный вызов означает, что метод вызовов B не в новом потоке. При выполнении этого метода C мы ничего не можем сделать и не можем дождаться его завершения.
Примеры синхронных обратных вызовов и асинхронных обратных вызовов
Давайте посмотрим на пример синхронного обратного вызова в Android:
button.setonClickListener (new View.onClickListener () {@Override public void onClick (view v) {log.i ("Button", "clicked");}});Кнопка регистрирует функцию обратного вызова через SetonClickListener и, как написано выше, передает ссылку на интерфейс в форме анонимного внутреннего класса. Поскольку кнопка вызывает SetOnClickListener без создания нового потока, это синхронный обратный вызов.
Асинхронный обратный вызов - это пример, о котором мы говорили в начале:
call.enqueue (новый обратный вызов <istorybean> () {@Override public void onResponse (call <vistorybean> call, ответ <astorybean> response) {astorybean hb = response.body (); if (hb == null) return; showtext.append (hb.iserror () + "); showtext.append (rb.getTitle () + "/n");Этот метод Enqueue является асинхронным методом для запроса удаленных сетевых данных. Когда он реализован внутри, он выполняется через новый поток.
Через эти два примера мы видим, что использование синхронных обратных вызовов и асинхронных обратных вызовов фактически разработано в соответствии с различными потребностями. Нельзя сказать, что один заменяет другого. Например, в кнопке нажимайте событие выше, если это асинхронный обратный вызов, эффект щелчка не появляется сразу после того, как пользователь нажимает кнопку, и пользователь не будет выполнять другие операции, он будет чувствовать себя странно. Асинхронные обратные вызовы для сетевых запросов, поскольку запрашиваемый ресурс может не существовать, сетевое соединение нестабильно, а по другим причинам пользователь не ясно относится к выполнению метода, поэтому он будет использовать асинхронные обратные вызовы, инициировать вызов метода и делать другие вещи, а затем ждать уведомления о вызова.
Применение метода обратного вызова в связи
Методы обратного вызова, упомянутые выше, за исключением обратных вызовов сетевой структуры запроса, все не имеют параметров. Давайте посмотрим на добавление параметров в метод обратного вызова, чтобы реализовать некоторые проблемы связи.
Если мы хотим, чтобы класс A получил данные класса B после серии расчетов и обработки, и два класса не могут просто относиться к данным класса A. Мы можем рассмотреть обратные вызовы.
Шаги следующие:
Шаги, упомянутые выше, немного абстрактны. Давайте посмотрим на пример ниже, один из них является клиентом, а другой - сервер. Клиент запрашивает трудоемкие данные сервера.
Public Class Client {Public Server Server; Public String запрос; // Сервер ссылки и получить ссылку на сервер. public Client Connect (сервер Server) {this.server = server; вернуть это; } // client, установить запрос public client setRequest (string request) {this.request = request; вернуть это; } // Достойно отправить метод запроса, выражение Lamdba. public void enqueue (server.callback callback) {new Thread (()-> server.setCallback (запрос, обратный вызов)). start (); }} Общедоступный сервер класса {public String response = "Это HTML"; // Зарегистрировать метод интерфейса обратного вызова и передавать данные в интерфейс обратного вызова через параметры public void setCallback (строка запроса, обратный вызов обратного вызова) {System.out.println («Запрос получил и рассчитывается ...»); new Thread (() -> {try {thread.sleep (5000); callback.onresponse (request + response);} catch (прерывание Exception e) {e.printstacktrace (); callback.onfail (e);}}). start (); } // Написать интерфейс в классе, который владеет данным общедоступным интерфейсом callback {void onResponse (string response); void onfail (бросаемый бросок); }}Далее, давайте посмотрим на тестовый пример:
открытый класс callbacktest {public static void main (string [] args) {client client = new Client (); client.connect (new server ()). setRequest ("Что это за файл?"). enqueue (new server.callback () {@Override public void onresponse (string response) {System.out.println (response);} @Override public void onfail (throwable throwable) {System.out.println (Throwable }}Результаты следующие:
Запрос был получен и рассчитывается ... что это за файл? Это HTML
Вышесказанное должно общаться через обратные вызовы.
Выше всего содержание этой статьи. Я надеюсь, что содержание этой статьи поможет всем, кто учится или работа. Я также надеюсь поддержать Wulin.com больше!