Comunicazione all'interno di un'app Android con EventBus

Una tipica app per Android tende ad essere composta da molti livelli, moduli o strutture come frammenti, attività, relatori e servizi. Una comunicazione efficace tra questi componenti può diventare difficile se sono strettamente accoppiati. 

Nel livello inferiore dell'architettura dell'app, come il database, quando si verifica un'azione, è possibile che si desideri inviare dati a un livello superiore, ad esempio la vista. Per fare ciò, è possibile creare un'interfaccia listener, attività asincrone o callback. Tutti questi funzioneranno, ma hanno alcuni importanti svantaggi:

  1. accoppiamento diretto o stretto
  2. registrando e annullando la registrazione di più dipendenze singolarmente
  3. ripetizione del codice
  4. difficoltà nel test
  5. aumento del rischio di bug

L'uso dell'architettura publish / subscribe o message bus previene tutti i potenziali problemi sopra evidenziati. È un ottimo modo per implementare comunicazioni efficaci tra i componenti di un'applicazione senza che nessuno di essi debba essere immediatamente informato degli altri. Usando pubblicare / iscriversi in Android, qualsiasi componente di app può pubblicare eventi che passerà al bus, e i consumatori interessati possono consumarli o sottoscriverli. 

Per utilizzare greenrobot EventBus, devi prima aggiungerlo nel modulo dell'app build.gradle file, includi compilare 'org.greenrobot:EventBus: 3.0.0', e quindi sincronizzare il progetto in seguito. 

Un iscritto all'evento

Un sottoscrittore si iscrive semplicemente a un evento registrandosi nel bus eventi e può anche annullare la registrazione di quell'evento. Per essere un abbonato, devi fare tre cose principali:

1. Registrare l'utente nel bus eventi con Registrare(). Questo informa il bus eventi che si desidera iniziare a ricevere eventi. In un'attività, questo è nel onStart () metodo, mentre in un frammento mettilo nel onAttact (attività dell'attività) metodo. 

@Override public void onStart () super.onStart (); . EventBus.getDefault () registrare (questo); 

2. Annullare la registrazione dell'abbonato, il che significa comunicare al bus eventi di interrompere l'invio di eventi. In un'attività, questo è nel onStop () metodo, mentre in un frammento mettilo nel onDetach () metodo. 

@Override public void onStop () super.onStop (); . EventBus.getDefault () annullare la registrazione (questo); 

3. Implementare il OnEvent () per indicare il tipo di evento che si desidera ricevere e le azioni da intraprendere quando si riceve l'evento. Notare il @Sottoscrivi annotazione nella parte superiore di questo metodo. In questo caso, vogliamo iscriversi ad un evento normale e non appiccicoso - spiegherò la differenza più tardi.

@Subscribe public void onEvent (evento MessageEvent) Toast.makeText (questo, "Ehi, il mio messaggio" + event.getMessage (), Toast.LENGTH_SHORT) .show () ;. 

Definizione dei messaggi di evento

Gli eventi in greenBot EventBus sono solo oggetti che tu definisci. Puoi avere diverse classi di eventi se vuoi. Non ereditano alcuna classe base o interfaccia: sono solo POJO (Plain Old Java Objects). 

public class MessageEvent public String mMessage; public MessageEvent (String message) mMessage = message;  public String getMessage () return mMessage; 

Post evento e post evento appiccicoso

La principale differenza tra evento post evento e post sticky è il meccanismo di cache utilizzato all'interno del bus eventi. Quando qualcuno pubblica un evento appiccicoso, questo evento è memorizzato in una cache. Quando una nuova attività o un nuovo frammento si abbona al bus eventi, ottiene l'ultimo evento appiccicoso dalla cache invece di attendere che venga nuovamente inviato al bus eventi, quindi questo evento rimane nella cache anche dopo che è stato ricevuto da un sottoscrittore. 

Gli eventi appiccicosi sono pubblicati con postSticky (MessageEvent) metodo e eventi non appiccicosi con il Post (MessageEvent) metodo.

EventBus.getDefault (). PostSticky (new MessageEvent ("Hey event subscriber!")); EventBus.getDefault (). Post (new MessageEvent ("Hey event subscriber!"));

Per un evento regolare, non appiccicoso, se non viene trovato alcun iscritto, l'evento verrà gettato via. Un evento appiccicoso verrà memorizzato nella cache, tuttavia, nel caso in cui un abbonato si presenti più tardi.

Quindi, quando decidi di utilizzare l'evento post-appiccicoso? Puoi farlo se stai rintracciando la posizione dell'utente, o per la semplice memorizzazione nella cache dei dati, il monitoraggio dei livelli della batteria, ecc. 

EventBus.getDefault (). PostSticky (new LocationReceivedEvent (6.4531, 3.3958))

Iscriviti a Post Sticky Event

// Gli aggiornamenti dell'interfaccia utente devono essere eseguiti su MainThread @Subscribe (sticky = true, threadMode = ThreadMode.MAIN) public void onEvent (evento MessageEvent) textField.setText (event.getMessage ()); 

Per iscriverti a un evento appiccicoso, includi appiccicoso = verodentro il @Sottoscrivi annotazione. Questo indica che vogliamo ricevere un evento di tipo appiccicoso MessageEvent dalla cache. 

Rimozione di eventi appiccicosi

LocationReceivedEvent locationReceivedStickyEvent = EventBus.getDefault (). GetStickyEvent (LocationReceived.class); if (stickyEvent! = null) EventBus.getDefault (). removeStickyEvent (locationReceivedStickyEvent); 

removeStickyEvent (Event) rimuove un evento appiccicoso dalla cache, e removeAllStickyEvents () rimuoverà tutti gli eventi appiccicosi. 

Modalità Discussione EventBus

Esistono quattro modalità di thread disponibili per gli iscritti tra cui scegliere: post, main, background e async.

spedizione

@Subscribe (threadMode = ThreadMode.POSTING)

Questo è l'impostazione predefinita. Gli abbonati verranno chiamati nello stesso thread del thread in cui è pubblicato l'evento. Compreso ThreadMode.POSTING nel tuo @Sottoscrivi l'annotazione è facoltativa. 

Principale 

@Subscribe (threadMode = ThreadMode.MAIN)

In questa modalità thread, gli iscritti riceveranno eventi nel thread principale dell'interfaccia utente, indipendentemente da dove è stato pubblicato l'evento. Questa è la modalità thread da utilizzare se si desidera aggiornare gli elementi dell'interfaccia utente come risultato dell'evento.

sfondo

@Subscribe (threadMode = ThreadMode.BACKGROUND)

In questa modalità thread, gli iscritti riceveranno eventi nello stesso thread in cui sono pubblicati, proprio come per ThreadMode.POSTING. La differenza è che se l'evento è pubblicato nel thread principale, gli abbonati li prenderanno invece su un thread in background. Questo assicura che la gestione degli eventi non blocchi l'interfaccia utente dell'app. Ancora, non eseguire un'operazione che richiederà molto tempo su questo thread. 

Async

@Subscribe (threadMode = ThreadMode.ASYNC)

In questa modalità thread, gli iscritti riceveranno sempre eventi indipendentemente dal thread corrente e dal thread principale. Ciò consente agli abbonati di essere eseguiti su un thread separato. Questo è utile per operazioni di lunga durata come le operazioni di rete. 

Priorità degli iscritti 

Se si desidera modificare l'ordine in cui gli abbonati ricevono gli eventi, è necessario specificare i loro livelli di priorità durante la registrazione. Gli abbonati con priorità più alta ottengono l'evento prima degli abbonati con una priorità più bassa. Questo riguarda solo gli abbonati nella stessa modalità thread. Si noti che la priorità predefinita è 0. 

@Subscribe (priorità = 1); public void onEvent (evento MessageEvent) textField.setText (event.getMessage ()); 

Annullamento di eventi

Se vuoi interrompere la consegna di un evento ad altri abbonati, chiama il cancelEventDelivery (evento Object) metodo all'interno del metodo di gestione degli eventi dell'abbonato. 

@Subscribe public void onEvent (evento MessageEvent) EventBus.getDefault (). CancelEventDelivery (event); 

Conclusione

In questo tutorial, hai imparato a conoscere:

  • greenrobot EventBus e come può migliorare la tua app per Android
  • la differenza tra eventi regolari e appiccicosi
  • le diverse modalità di thread disponibili e quando utilizzarle
  • priorità degli abbonati
  • annullare un evento per interrompere la ricezione di eventi

Per ulteriori informazioni su greenrobot EventBus, ti suggerisco di visitare la documentazione ufficiale.

Un'altra libreria che è possibile utilizzare per implementare un bus eventi è RxAndroid. Controlla il nostro articolo su RxAndroid qui su Envato Tuts +, o prova alcuni dei nostri altri corsi o tutorial Android.

  • Iniziare con ReactiveX su Android

    Il codebase di app complesse con molte connessioni di rete e interazioni dell'utente è spesso disseminato di callback. Tale codice non è solo lungo e difficile da ...
    Ashraff Hathibelagal
    androide
  • Un'introduzione a Loopj

    In questo tutorial imparerai ad usare Loopj, una libreria facile da usare per le richieste HTTP in Android. Per aiutarti ad imparare, useremo Loopj per creare ...
    Pedro Gonzalez Ferrandez
    Studio Android
  • Android From Scratch: informazioni sulle trasmissioni Android

    In questo tutorial imparerai come creare, inviare e ricevere trasmissioni locali e di sistema. Imparerai anche come utilizzare un popolare di terze parti ...
    Ashraff Hathibelagal
    SDK Android
  • Anima la tua app per Android

    Le animazioni sono diventate una parte importante dell'esperienza utente di Android. Un'animazione sottile e ben realizzata è utilizzata in tutto il sistema operativo Android e può rendere ...
    Ashraff Hathibelagal
    Sviluppo mobile