Una función de devolución de llamada es una función que se pasa a otra función como argumento y se espera que se ejecute después de algún tipo de evento. El propósito de la función de devolución de llamada es informar a una clase Sync/Async si se realizó algún trabajo en otra clase. Esto es muy útil cuando se trabaja con tareas asincrónicas. Supongamos que queremos realizar algunas tareas de rutina, como realizar alguna operación o mostrar contenido después de hacer clic en un botón, o buscar datos de Internet. Esto también se usa en el manejo de eventos, ya que recibimos una notificación cuando se hace clic en un botón a través de la función de devolución de llamada.
Este tipo de patrón de diseño se utiliza en el patrón de diseño del observador . El patrón del observador es un patrón de diseño de software en el que un objeto, llamado sujeto, mantiene una lista de sus dependientes, llamados observadores, y les notifica automáticamente cualquier cambio de estado, generalmente mediante llamando a uno de sus métodos ( Fuente: wiki ).
En Java, las devoluciones de llamada se pueden implementar mediante una interfaz. El procedimiento general para la implementación se indica a continuación.
1. Define the methods in an interface that we want to invoke after callback. 2. Define a class that will implement the callback methods of the interface. 3. Define a reference in other class to register the callback interface. 4. Use that reference to invoke the callback method.
Devolución de llamada síncrona
La ejecución del código bloqueará o esperará el evento antes de continuar. Hasta que su evento devuelva una respuesta, su programa no se ejecutará más. Básicamente, la devolución de llamada realiza todo su trabajo antes de volver a la declaración de llamada. El problema con las devoluciones de llamadas sincrónicas es que parecen retrasarse.
A continuación se muestra la implementación simple de este principio.
// Java program to illustrate synchronous callback interface OnGeekEventListener { // this can be any type of method void onGeekEvent(); } class B { private OnGeekEventListener mListener; // listener field // setting the listener public void registerOnGeekEventListener(OnGeekEventListener mListener) { this.mListener = mListener; } // my synchronous task public void doGeekStuff() { // perform any operation System.out.println("Performing callback before synchronous Task"); // check if listener is registered. if (this.mListener != null) { // invoke the callback method of class A mListener.onGeekEvent(); } } // Driver Function public static void main(String[] args) { B obj = new B(); OnGeekEventListener mListener = new A(); obj.registerOnGeekEventListener(mListener); obj.doGeekStuff(); } } class A implements OnGeekEventListener { @Override public void onGeekEvent() { System.out.println("Performing callback after synchronous Task"); // perform some routine operation } // some class A methods }
Producción:
Performing callback before synchronous Task Performing callback after synchronous Task
Devolución de llamada asíncrona
Una llamada asincrónica no bloquea la ejecución del código del programa. Cuando la llamada regresa del evento, la llamada vuelve a la función de devolución de llamada. Entonces, en el contexto de Java, tenemos que crear un nuevo hilo e invocar el método de devolución de llamada dentro de ese hilo. La función de devolución de llamada se puede invocar desde un subproceso, pero no es un requisito. Una devolución de llamada también puede iniciar un nuevo hilo, haciéndose así asíncrona.
A continuación se muestra la implementación simple de este principio.
// Java program to illustrate Asynchronous callback interface OnGeekEventListener { // this can be any type of method void onGeekEvent(); } class B { private OnGeekEventListener mListener; // listener field // setting the listener public void registerOnGeekEventListener(OnGeekEventListener mListener) { this.mListener = mListener; } // My Asynchronous task public void doGeekStuff() { // An Async task always executes in new thread new Thread(new Runnable() { public void run() { // perform any operation System.out.println("Performing operation in Asynchronous Task"); // check if listener is registered. if (mListener != null) { // invoke the callback method of class A mListener.onGeekEvent(); } } }).start(); } // Driver Program public static void main(String[] args) { B obj = new B(); OnGeekEventListener mListener = new A(); obj.registerOnGeekEventListener(mListener); obj.doGeekStuff(); } } class A implements OnGeekEventListener { @Override public void onGeekEvent() { System.out.println("Performing callback after Asynchronous Task"); // perform some routine operation } // some class A methods }
Producción:
Performing operation in Asynchronous Task Performing callback after Asynchronous Task
Cuándo usar qué
Devolución de llamada síncrona: cualquier proceso que tenga múltiples tareas donde las tareas deben ejecutarse en secuencia y no ocupan mucho tiempo debe usar devoluciones de llamada síncronas.
Por ejemplo: está en la cola de una película para comprar una entrada y no puede obtener una hasta que todos los que están delante de usted obtengan una.
Devolución de llamada asíncrona: cuando las tareas no dependen unas de otras y pueden tardar algún tiempo en ejecutarse, debemos usar devoluciones de llamada asíncronas.
Por ejemplo: cuando pides tu comida, otras personas también pueden pedir su comida en el restaurante. No tienen que esperar a que finalice su pedido, si está descargando una canción de Internet, obteniendo una respuesta API.
Referencias:
https://www.javaworld.com/article/2077462/learn-java/java-tip-10–implement-callback-routines-in-java.html
https://en.wikipedia.org/wiki/Callback_ (programación de computadoras)
Publicación traducida automáticamente
Artículo escrito por rishabh jindal 1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA