Costruire un'app per Android con più componenti attivi che comunicano tra loro può diventare noioso. Per risparmiare tempo, gli sviluppatori spesso finiscono con componenti strettamente accoppiati nelle loro app. EventBus è una famosa libreria open source creata per risolvere questo problema usando il editore / sottoscrittore modello.
Usando la libreria EventBus, puoi passare messaggi da una classe a una o più classi in poche righe di codice. Inoltre, tutte le classi coinvolte sono completamente separate l'una dall'altra, portando a un codice che è meno complesso e più facile da mantenere ed eseguire il debug.
In questo suggerimento rapido, imparerai come utilizzare la libreria EventBus creando una semplice applicazione Android che visualizza lo stato di ricarica del dispositivo. Poiché i cambiamenti nello stato di ricarica sono eventi di sistema, l'app avrà un Attività
che ha bisogno di ricevere informazioni da a BroadcastReceiver
-lo scenario perfetto per l'utilizzo di un bus eventi.
Assicurati di avere impostato il pacchetto Eclipse ADT. Puoi scaricarlo dal sito web degli sviluppatori Android.
Avvia Eclipse e crea una nuova applicazione Android. Dai un nome all'applicazione EventBusSample
. Scegli un nome di pacchetto univoco e imposta il SDK richiesto minimo a androide 2.2 e il SDK target a androide 4.4.
Creeremo il Attività
noi stessi, quindi deseleziona Crea attività e fare clic finire.
Questa app ha uno BroadcastReceiver
che risponde alle seguenti azioni:
android.intent.action.ACTION_POWER_CONNECTED
android.intent.action.ACTION_POWER_DISCONNECTED
Dai il nome a BroadcastReceiver
ChargingReceiver
e dichiararlo nel AndroidManifest.xml
file.
L'app ne ha uno Attività
per visualizzare lo stato di ricarica. Nominalo DisplayActivity
e dichiararlo come mostrato di seguito.
Scarica l'ultima versione della libreria EventBus come JAR da Maven Central e aggiungi il JAR nei tuoi progetti libs
elenco.
ChargingEvent
ClasseGli eventi sul bus eventi non sono altro che oggetti contenenti le informazioni che devono essere comunicate. Permettere ChargingEvent
sii il nome della classe che contiene le informazioni passate dal BroadcastReceiver
al Attività
. Questa è una classe semplice che ha solo un Stringa
per rappresentare l'informazione. Ha anche un costruttore per impostare il valore della stringa e un accessor per ottenere il suo valore.
Crea un nuovo file chiamato ChargingEvent.java e aggiungere il seguente codice ad esso:
pacchetto com.hathy.eventbussample; public class ChargingEvent private String data; public ChargingEvent (String data) this.data = data; public String getData () return data;
BroadcastReceiver
ClasseCrea una nuova classe chiamata ChargingReceiver
quello si estende BroadcastReceiver
. Questa classe utilizza il bus eventi per pubblicare messaggi. Ha una variabile chiamata autobus
, che fa riferimento al bus creato dalla libreria EventBus. L'autobus è un singleton e devi usare il getDefault
metodo per riferirsi ad esso.
Nel OnReceive
metodo, creiamo una nuova istanza di ChargingEvent
classe e aggiungere il nostro messaggio ad esso. Ecco un messaggio di esempio:
@ 14: 23: 20 questo dispositivo ha iniziato a caricarsi.
Per generare questo messaggio, dobbiamo fare quanto segue:
Tempo
classe per impostare l'ora in cui si è verificato l'evento.Intent.ACTION_POWER_CONNECTED
, il dispositivo è in carica. Se è Intent.ACTION_POWER_DISCONNECTED
, il dispositivo sta scaricando.Una volta il ChargingEvent
l'oggetto ha le giuste informazioni, è pubblicato sul bus degli eventi usando il inviare
metodo. L'implementazione del ChargingReceiver
la classe dovrebbe ora assomigliare a questa:
pacchetto com.hathy.eventbussample; import de.greenrobot.event.EventBus; importare android.content.BroadcastReceiver; importare android.content.Context; import android.content.Intent; import android.text.format.Time; public class ChargingReceiver estende BroadcastReceiver bus EventBus privato = EventBus.getDefault (); @Override public void onReceive (Context context, Intent intent) ChargingEvent event = null; // Ottieni ora corrente Ora ora = nuova Ora (); now.setToNow (); String timeOfEvent = now.format ("% H:% M:% S"); String eventData = "@" + timeOfEvent + "dispositivo avviato"; if (intent.getAction (). equals (Intent.ACTION_POWER_CONNECTED)) event = new ChargingEvent (eventData + "charge."); else if (intent.getAction (). equals (Intent.ACTION_POWER_DISCONNECTED)) event = new ChargingEvent (eventData + "discharging."); // Posta l'evento bus.post (evento);
Come puoi vedere, la pubblicazione dei messaggi sul bus degli eventi richiede solo una singola riga di codice. Inoltre, l'editore non ha bisogno di sapere nulla sugli abbonati.
DisplayActivity
ClasseCrea una nuova classe chiamata DisplayActivity
. Questa classe è responsabile della visualizzazione dei messaggi degli eventi pubblicati sul bus eventi.
Anche questa classe ha una variabile che fa riferimento al bus degli eventi. Poiché la libreria EventBus segue il modello singleton, l'istanza del bus eventi è disponibile per questo Attività
è uguale all'istanza disponibile per BroadcastReceiver
.
Per consentire a una classe di iscriversi agli eventi sul bus, il Registrare
il metodo è invocato. Nel nostro Attività
, lo chiamiamo nel onCreate
metodo.
Allo stesso modo, per smettere di ricevere eventi, il annullare la registrazione
il metodo è invocato. Chiamiamo questo metodo nel OnDestroy
metodo per assicurarsi che tutte le risorse siano liberate.
Il Attività
ha un layout molto semplice, contenente solo a TextView
che visualizza i messaggi. Non è quindi necessario creare un layout per questo. Usiamo semplicemente il TextView
come la vista del contenuto del Attività
.
A questo punto, l'implementazione del DisplayActivity
la classe dovrebbe assomigliare a questa:
pacchetto com.hathy.eventbussample; importare android.app.Activity; importare android.os.Bundle; import android.widget.TextView; import de.greenrobot.event.EventBus; public class DisplayActivity estende Activity bus EventBus privato = EventBus.getDefault (); vista TextView privata; @Override protected void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState); view = new TextView (this); view.setTextSize (20f); view.setPadding (20, 20, 20, 20); view.setText ("In attesa di eventi ..."); setContentView (vista); // Registrati come sottoscrittore bus.register (questo); @Override protected void onDestroy () // Annulla registrazione bus.unregister (this); super.onDestroy ();
Ogni classe che intende ricevere eventi dal bus eventi deve contenere un OnEvent
metodo. Il nome di questo metodo è importante, perché la libreria EventBus utilizza il API Java Reflection per accedere a questo metodo. Ha un singolo parametro che si riferisce all'evento. Nel nostro caso, il parametro sarà di tipo ChargingEvent
.
Tutto ciò che facciamo in questo metodo è aggiungere l'ultimo messaggio ricevuto al contenuto del TextView
. L'implementazione del OnEvent
il metodo assomiglia a questo:
public void onEvent (evento ChargingEvent) view.setText (view.getText () + "\ n" + event.getData ());
L'app è ora pronta per essere testata. Compilalo ed eseguilo su un dispositivo Android fisico. Una volta che l'app ha terminato l'avvio, collega e scollega il cavo di alimentazione un paio di volte per vedere come cambia lo stato della ricarica.
In questo tutorial, hai imparato come utilizzare la libreria EventBus e quanto semplifica la comunicazione tra le classi. La libreria è ottimizzata per la piattaforma Android ed è molto leggera. Ciò significa che puoi utilizzarlo nei tuoi progetti senza doversi preoccupare delle dimensioni della tua app. Per saperne di più sulla libreria EventBus, visita il progetto su GitHub.