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:
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 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 () ;.
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;
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))
// 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 = vero
dentro il @Sottoscrivi
annotazione. Questo indica che vogliamo ricevere un evento di tipo appiccicoso MessageEvent
dalla cache.
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.
Esistono quattro modalità di thread disponibili per gli iscritti tra cui scegliere: post, main, background e async.
@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.
@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.
@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.
@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.
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 ());
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);
In questo tutorial, hai imparato a conoscere:
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.