2010-09-23 22 views
22

Acabo de cambiar de iPhone a Android y estoy buscando algo similar a donde en el SDK de iPhone, cuando una clase termina una determinada tarea, llama a los métodos delegados en objetos establecidos como delegados.Android - ¿Algo similar a las devoluciones de llamadas delegadas SDK de iPhone?

No necesito muchos detalles. Revisé los documentos y no encontré nada (lo más cerca que me dieron fue "intenciones de emisión", que parecen ser notificaciones de iOS).

Incluso si alguien puede indicarme la documentación correcta, sería genial.

Gracias!

+0

El paradagm iPhone es bastante diferente a la de Android. Si explica lo que está tratando de lograr con esto, alguien podría ayudarlo a encontrar la forma de Android. –

+0

Bueno, estoy usando un objeto singleton que envuelve el objeto MediaPlayer de Android y tiene su propio conjunto de métodos para reproducir una pista específica, pausar, reproducir, etc. Lo que quiero es que cuando la pista se detenga o se inicie, debería "enviar" una notificación "a las clases que hacen referencia al objeto singleton para actualizar la imagen del botón de reproducción a un icono de pausa o a un icono de reproducción. Espero que esto aclare las cosas? – Sid

Respuesta

14
Nunca

importa ... encontró la respuesta aquí :)

http://www.javaworld.com/javaworld/javatips/jw-javatip10.html


pegar del artículo con el fin de conservarla:

Desarrolladores versado en el evento impulsado El modelo de programación de MS-Windows y el sistema de ventanas X están acostumbrados a pasar los punteros a las funciones que se invocan (es decir, "volver a llamar") cuando sucede algo. El modelo orientado a objetos de Java actualmente no es compatible con punteros de método, y por lo tanto parece excluir el uso de este mecanismo cómodo. ¡Pero no todo está perdido!

El soporte de interfaces de Java proporciona un mecanismo por el cual podemos obtener el equivalente de devoluciones de llamada. El truco consiste en definir una interfaz simple que declare el método que queremos invocar.

Por ejemplo, supongamos que queremos que nos notifiquen cuando ocurre un evento. Podemos definir una interfaz:

public interface InterestingEvent 
{ 
    // This is just a regular method so it can return something or 
    // take arguments if you like. 
    public void interestingEvent(); 
} 

Esto nos da un control sobre los objetos de las clases que implementan la interfaz. Por lo tanto, no tenemos que preocuparnos por ninguna otra información de tipo extraño. Esto es mucho mejor que piratear funciones de trampolín C que usan el campo de datos de widgets para contener un puntero de objeto cuando se usa código C++ con Motif.

La clase que señalará el evento tiene que esperar objetos que implementan la interfaz InterestingEvent y luego invocar el interestingEvent() método según sea apropiado.

public class EventNotifier 
{ 
    private InterestingEvent ie; 
    private boolean somethingHappened; 
    public EventNotifier (InterestingEvent event) 
    { 
    // Save the event object for later use. 
    ie = event; 
    // Nothing to report yet. 
    somethingHappened = false; 
    } 
    //... 
    public void doWork() 
    { 
    // Check the predicate, which is set elsewhere. 
    if (somethingHappened) 
     { 
     // Signal the even by invoking the interface's method. 
     ie.interestingEvent(); 
     } 
    //... 
    } 
    // ... 
} 

En ese ejemplo, he utilizado la somethingHappened predicado a realizar un seguimiento de si el evento debe ser activado. En muchos casos, el mero hecho de que se haya llamado al método es suficiente para garantizar la señalización del interestingEvent().

El código que desea recibir la notificación de evento debe implementar la interfaz InterestingEvent y simplemente pasar una referencia a sí mismo al notificador de eventos.

public class CallMe implements InterestingEvent 
{ 
    private EventNotifier en; 
    public CallMe() 
    { 
    // Create the event notifier and pass ourself to it. 
    en = new EventNotifier (this); 
    } 
    // Define the actual handler for the event. 
    public void interestingEvent() 
    { 
    // Wow! Something really interesting must have occurred! 
    // Do something... 
    } 
    //... 
} 

Eso es todo. Espero que usar este simple modismo de Java hará que su transición a Java sea un poco menos nerviosa.

+11

Si bien este enlace puede responder la pregunta, es mejor incluir las partes esenciales de la respuesta aquí y proporcionar el enlace de referencia. Las respuestas de solo enlace pueden dejar de ser válidas si la página vinculada cambia. – ProgramFOX

+0

este ejemplo no explica cómo establecer la referencia de la actividad que implementa la interfaz – hariszaman

+0

este artículo está en todas partes, y desde '99 ??? – hanzolo

1

La devolución de llamada de Java no es lo mismo que ios delegate, en ios puede usar una devolución de llamada casi de la misma manera que en Android. En Android hay startActivityForResult que pueden ayudarle a implementar las tareas para qué ios delegados se usa.

+0

Bam agradece la respuesta, pero esto solo será útil si la clase que inicia la actividad necesita saber si sucede algo, y solo cuando el usuario se retira de la actividad iniciada. La solución que publiqué le permite establecer una clase como el "delegado" de otra sin que tengan ningún tipo de relación. – Sid

1

Creo que ListAdapter es un ejemplo de patrón de delegación en Android.

+0

Hola David, estoy de acuerdo. Diría que es más similar a DataSources en iOS :) ¡Gracias por la entrada! – Sid

+0

@Sid En realidad, DataSource es un tipo especial de delegados. – DavidLiu

+0

David, sí, eso es correcto, y lo sé, pero a lo que me refiero es a la similitud contextual. Un ListAdapter es un DataSource, lo que un OnItemClickListener en una lista es para un delegado. – Sid

3

El contenido principal de this video tutorial es mostrar cómo usar interfaces para delegar métodos/intercambio de datos entre diferentes Fragmentos y actividades, pero es un gran ejemplo aprender cómo se puede implementar el patrón delegado en Java para Android.

enter image description here

Cuestiones relacionadas