2010-09-23 12 views
22

Ho appena passato da iPhone ad Android e sto cercando qualcosa di simile a dove nell'SDK di iPhone, quando una classe termina una determinata attività, chiama i metodi delegati negli oggetti impostati come delegati.Android - Qualcosa di simile a iPhone SDK Delegate Callbacks?

Non ho bisogno di troppi dettagli. Ho esaminato i documenti e non ho trovato nulla (il più vicino che ho ottenuto è stato "intenti broadcast" che sembrano più le notifiche iOS).

Anche se qualcuno può indicarmi la documentazione corretta, sarebbe fantastico.

Grazie!

+0

Il paradagm iPhone è piuttosto diversa da quella di Android. Se spieghi cosa stai cercando di realizzare con questo, qualcuno potrebbe essere in grado di aiutarti a trovare il modo Android. –

+0

Beh, sto usando un oggetto singleton che avvolge l'oggetto Android MediaPlayer e ha il proprio set di metodi per riprodurre una traccia specifica, mettere in pausa, riprodurre, ecc. Quello che voglio è che quando la traccia si ferma o si avvia, dovrebbe "inviare" una notifica "alle classi che fanno riferimento all'oggetto singleton per aggiornare l'immagine del pulsante di riproduzione a un'icona di pausa o a un'icona di riproduzione. Spero che questo abbia chiarito le cose? – Sid

risposta

14

Non importa ... trovato la risposta qui :)

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


incollare dall'articolo in modo da preservarlo:

sviluppatori dimestichezza nella event-driven il modello di programmazione di MS-Windows e il sistema X Window sono abituati a passare i puntatori di funzione che vengono invocati (cioè "richiamati") quando succede qualcosa. Il modello orientato agli oggetti di Java al momento non supporta i puntatori del metodo, e quindi sembra precludere l'utilizzo di questo comodo meccanismo. Ma non tutto è perduto!

Il supporto delle interfacce Java fornisce un meccanismo grazie al quale è possibile ottenere l'equivalente di callback. Il trucco è definire un'interfaccia semplice che dichiari il metodo che vogliamo invocare.

Ad esempio, supponiamo di voler ricevere una notifica quando si verifica un evento. Possiamo definire un'interfaccia:

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

Questo ci consente di controllare qualsiasi oggetto di classi che implementa l'interfaccia. Quindi, non dobbiamo preoccuparci di altre informazioni di tipo estraneo. Questo è molto più bello dell'hacking delle funzioni C trampolino che usano il campo dati dei widget per contenere un puntatore oggetto quando si usa il codice C++ con Motif.

La classe che segnalerà l'evento deve aspettarsi oggetti che implementano l'interfaccia InterestingEvent e quindi richiamare il interestingEvent() metodo appropriato.

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(); 
     } 
    //... 
    } 
    // ... 
} 

In questo esempio, ho usato il somethingHappened predicato per monitorare se l'evento deve essere attivato. In molti casi, il fatto stesso che il metodo sia stato chiamato è sufficiente per giustificare la segnalazione di interestingEvent().

Il codice che desidera ricevere la notifica dell'evento deve implementare l'interfaccia InteressanteEventore e passare semplicemente un riferimento a se stesso al notificatore di eventi.

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... 
    } 
    //... 
} 

Questo è tutto quello che c'è da fare. Spero che usare questo semplice linguaggio Java renderà la transizione verso Java un po 'meno agitata.

+11

Sebbene questo collegamento possa rispondere alla domanda, è meglio includere qui le parti essenziali della risposta e fornire il link per riferimento. Le risposte di solo collegamento possono diventare non valide se la pagina collegata cambia. – ProgramFOX

+0

questo esempio non spiega come impostare il riferimento dell'attività che implementa l'interfaccia – hariszaman

+0

questo articolo è ovunque, e dal '99 ??? – hanzolo

1

La richiamata Java non è la stessa cosa di un delegato ios, in iOS è possibile utilizzare una richiamata quasi allo stesso modo di Android. In Android c'è lo startActivityForResult che può aiutarti a implementare le attività per ciò che viene utilizzato il delegato di ios.

+0

Bam, grazie per la risposta, ma ciò si rivelerà utile solo se la classe che lancia l'attività deve sapere se succede qualcosa e solo quando l'utente si ritira dall'attività avviata. La soluzione che ho postato ti permette di impostare una classe come "delegata" di un'altra senza che abbiano alcun tipo di relazione. – Sid

1

Credo che ListAdapter sia un esempio di modello di delega in Android.

+0

Ciao David, sono quasi d'accordo. Direi che è più simile a DataSources in iOS :) Grazie per l'input! – Sid

+0

@ Sid In realtà, DataSource è un tipo speciale di delegati. – DavidLiu

+0

David, sì è corretto, e ne sono consapevole, ma quello a cui mi riferivo è la somiglianza contestuale. Un ListAdapter è a un DataSource, ciò che OnItemClickListener su un elenco è per un delegato. – Sid

3

Il contenuto principale di this video tutorial mostra come utilizzare le interfacce per delegare i metodi/lo scambio di dati tra diversi frammenti e attività, ma è un ottimo esempio per imparare come implementare pattern delegate in Java per Android.

enter image description here

Problemi correlati