2009-09-25 15 views
10

Tengo una clase llamada CommunicationManager que se encarga de la comunicación con el servidor.Cómo implementar callbacks en Java

Incluye los métodos login() y onLoginResponse(). En caso de inicio de sesión de usuario, se debe llamar al método login() y cuando el servidor responde, se ejecuta el método onLoginResponse().

Lo que quiero hacer es enlazar acciones con la interfaz de usuario. En la clase de GUI, creé una instancia de CommunicationManager llamada mCommunicationManager. De la clase GUI el método login() se llama simplemente por la línea

mCommunicationManager.login(); 

Lo que no sé hacer es vinculante para el método de la clase GUI para onLoginResponse(). Por ejemplo, si la clase de GUI incluye el método notifyUser() que muestra el mensaje recibido del servidor.

Realmente agradecería si alguien podría mostrar cómo enlazar métodos con el fin de ejecutar el método de la clase de interfaz gráfica de usuario (ej. GUI.notifyUser()) cuando la instancia de la clase mCommunicationManager recibe el mensaje desde el servidor y el método se ejecuta CommunicationManager.onLoginResponse().

Gracias!

+0

¿Por qué no se ha dicho nada acerca de la llamada http para esta función de devolución de llamada que implica swing? – gumuruh

+0

Pregunta de un novato. ¿Por qué puede hacer System.out.print (mCommunicationManager.login()); (supongamos, imprimir el mensaje del servidor es la tarea)? Entiendo el caso de uso en un modelo de múltiples hilos, pero no puedo visualizar el escenario de inicio de sesión en un modelo de múltiples hilos. – user3388324

Respuesta

25

Aquí puedo ver dos patrones que puedo verte usando. Uno es el publish/subscribe or observer pattern mencionado por Pete. Creo que esto es probablemente lo que quieres, pero como la pregunta menciona que se debe vincular un método para su posterior ejecución, pensé que debería mencionar el Command pattern.

El patrón Command es básicamente una solución para el hecho de que java no trata los métodos (funciones) como objetos de primera clase y, por lo tanto, es imposible pasarlos.En su lugar, crea una interfaz que se puede pasar y que encapsula la información necesaria sobre cómo llamar al método original.

Así que para su ejemplo:

interface Command { 
    public void execute(); 
} 

y, a continuación, pasa en un caso de este comando cuando se ejecuta la función login() (no probado, siempre se me olvida cómo conseguir clases anónimas derecha):

final GUI target = this; 
command = new Command() { 
    @Override 
    public void execute() { 
     target.notifyUser(); 
    } 
}; 
mCommunicationManager.login(command); 

Y en la función de inicio de sesión() (Manager guarda referencia a comandos):

public void login() { 
    command.execute(); 
} 

edit: Probablemente debería mencionar que, si bien esta es la explicación general de cómo funciona, en Java ya hay algo de fontanería para este propósito, es decir, ActionListener y clases relacionadas (actionPerformed() es básicamente execute() en Command). En su mayoría, están destinados a ser utilizados con las clases AWT y/o Swing, y por lo tanto tienen características específicas para ese caso de uso.

1

Usted puede mirar en el SWT-fragmentos (mirar a los oyentes)

http://www.eclipse.org/swt/snippets/

o utilizar la clase ejecutable, por overwritting el método run con su 'callback' de código cuando se crea una instancia

3

El lenguaje utilizado en Java para lograr un comportamiento de devolución de llamada es oyentes. Construya una interfaz con los métodos para los eventos que desee, tenga un mecanismo para registrar el objeto detector con el origen de los eventos. Cuando ocurre un evento, llame al método correspondiente en cada oyente registrado. Este es un patrón común para los eventos AWT y Swing; para un ejemplo elegido al azar, vea FocusListener y el objeto correspondiente FocusEvent.

Tenga en cuenta que todos los eventos en Java AWT y hereda la oscilación en última instancia de EventObject y la convención es llamar al oyente SomethingListener y el evento SomethingEvent. Aunque puede salirse con la suya nombrando su código como quiera, es más fácil mantener un código que se apegue a las convenciones de la plataforma.

Cuestiones relacionadas