Construirea unei aplicații Android care are mai multe componente active comunicând între ele poate deveni obositoare. Pentru a economisi timp, dezvoltatorii ajung adesea cu componente strâns cuplate în aplicațiile lor. EventBus este o populară open-source bibliotecă care a fost creată pentru a rezolva această problemă folosind editor / abonat model.
Utilizând biblioteca EventBus, puteți transmite mesaje dintr-o clasă la una sau mai multe clase în doar câteva rânduri de cod. Mai mult decât atât, toate clasele implicate sunt complet decuplate unul de celălalt, ducând la un cod care este mai puțin complex și mai ușor de întreținut și depanat.
În acest sfat rapid, veți învăța cum să utilizați biblioteca EventBus construind o aplicație Android simplă care afișează starea de încărcare a dispozitivului. Deoarece modificările în starea de încărcare sunt evenimente de sistem, aplicația va avea un Activitate
care trebuie să primească informații de la BroadcastReceiver
-scenariul perfect pentru utilizarea unei magistrale de evenimente.
Asigurați-vă că aveți setul de pachete ADT Eclipse. Puteți să o descărcați de pe site-ul Android Developer.
Porniți Eclipse și creați o nouă aplicație Android. Denumiți aplicația EventBusSample
. Alegeți un nume de pachet unic și setați SDK minim necesar la Android 2.2 si SDK destinație la Android 4.4.
Vom crea Activitate
noi înșine, deselectează-ne Creați activitate și faceți clic pe finalizarea.
Această aplicație are una BroadcastReceiver
care răspunde următoarelor acțiuni:
android.intent.action.ACTION_POWER_CONNECTED
android.intent.action.ACTION_POWER_DISCONNECTED
Denumiți BroadcastReceiver
ChargingReceiver
și să o declare în AndroidManifest.xml
fişier.
Aplicația are unul Activitate
pentru a afișa starea de încărcare. Numeste DisplayActivity
și declarați așa cum este arătat mai jos.
Descărcați cea mai recentă versiune a librăriei EventBus ca JAR de la Maven Central și adăugați JAR în proiectul dvs. libs
director.
ChargingEvent
ClasăEvenimentele din magistrala evenimentelor nu sunt decât obiecte care conțin informațiile care trebuie comunicate. Lăsa ChargingEvent
să fie numele clasei care conține informațiile transmise de la BroadcastReceiver
la Activitate
. Aceasta este o clasă simplă, care are doar a Şir
pentru a reprezenta informațiile. De asemenea, are un constructor pentru a seta valoarea șirului și a unui accesoriu pentru a obține valoarea acestuia.
Creați un fișier nou numit ChargingEvent.java și adăugați următorul cod:
pachet com.hathy.eventbussample; clasa publica ChargingEvent date private String; public ChargingEvent (date despre șir) this.data = date; public String getData () return date;
BroadcastReceiver
ClasăCreați o nouă clasă numită ChargingReceiver
care se extinde BroadcastReceiver
. Această clasă utilizează magistrala pentru evenimente pentru a publica mesaje. Are o variabilă numită autobuz
, care se referă la magistrala creată de biblioteca EventBus. Autobuzul este un singleton și trebuie să utilizați getDefault
se referă la aceasta.
În onReceive
metoda, vom crea o nouă instanță a ChargingEvent
și adăugați mesajul nostru. Iată un exemplu de mesaj:
@ 14: 23: 20 acest dispozitiv a început să se încarce.
Pentru a genera acest mesaj, trebuie să facem următoarele:
Timp
pentru a seta ora la care a avut loc evenimentul.Intent.ACTION_POWER_CONNECTED
, dispozitivul se încarcă. Dacă este Intent.ACTION_POWER_DISCONNECTED
, dispozitivul se descarcă.Odata ce ChargingEvent
obiectul are informațiile corecte, este publicat pe magistrala evenimentului utilizând post
metodă. Punerea în aplicare a directivei ChargingReceiver
clasa ar trebui să arate astfel:
pachet com.hathy.eventbussample; import de.greenrobot.event.EventBus; import șiroid.content.BroadcastReceiver; importați android.content.Context; import șiroid.content.Intent; importați android.text.format.Time; public class ChargingReceiver extinde BroadcastReceiver private EventBus bus = EventBus.getDefault (); @Override public void onReceive (Contextul contextului, intenția intenției) Eventul ChargingEvent = null; // Obțineți ora curentă Ora acum = nou Ora (); now.setToNow (); String timeOfEvent = acum.format ("% H:% M:% S"); String eventData = "@" + timeOfEvent + "acest dispozitiv a început"; dacă (intent.getAction () este egal cu (Intent.ACTION_POWER_CONNECTED)) event = nou ChargingEvent (eventData + "încărcare."); else dacă (intent.getAction () este egal cu (Intent.ACTION_POWER_DISCONNECTED)) event = nou ChargingEvent (eventData + "descărcare."); // Postați evenimentul bus.post (eveniment);
După cum puteți vedea, publicarea mesajelor către magistrala de evenimente are doar o singură linie de cod. Mai mult, editorul nu are nevoie să știe nimic despre abonatul (abonații).
DisplayActivity
ClasăCreați o nouă clasă numită DisplayActivity
. Această clasă este responsabilă pentru afișarea mesajelor evenimentelor publicate pe magistrala evenimentului.
Această clasă are de asemenea o variabilă care se referă la busul de evenimente. Deoarece biblioteca EventBus urmărește modelul singleton, instanța busului de evenimente disponibilă pentru aceasta Activitate
este același cu instanța disponibilă BroadcastReceiver
.
Pentru a permite unei clase să se aboneze la evenimente de pe magistrala Inregistreaza-te
metoda este invocată. În a noastră Activitate
, o numim în onCreate
metodă.
În mod similar, pentru a opri recepționarea evenimentelor, anulați înregistrarea
metoda este invocată. Noi numim această metodă în onDestroy
pentru a vă asigura că toate resursele sunt eliberate.
Activitate
are un layout foarte simplu, care conține doar a TextView
care afișează mesajele. Prin urmare, nu este nevoie să creați un aspect pentru acesta. Pur și simplu folosim TextView
ca vizualizare a conținutului Activitate
.
În acest moment, punerea în aplicare a DisplayActivity
clasa ar trebui să arate astfel:
pachet com.hathy.eventbussample; importă android.app.Activity; import android.os.Bundle; import șiroid.widget.TextView; import de.greenrobot.event.EventBus; clasa publica DisplayActivity extinde Activitatea private EventBus bus = EventBus.getDefault (); vizualizare privată TextView; @Override protejate void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState); view = new TextView (aceasta); view.setTextSize (20f); vizualizarea.setului (20, 20, 20, 20); view.setText ("Așteptare pentru evenimente ..."); setContentView (vizualizare); // Înregistrați-vă ca un abonat bus.register (acest); @Override protejate void onDestroy () / Unregister bus.unregister (this); super.onDestroy ();
Fiecare clasă care intenționează să primească evenimente din autobuzul evenimentului ar trebui să conțină una onEvent
metodă. Numele acestei metode este important, deoarece biblioteca EventBus utilizează Java Reflection API pentru a accesa această metodă. Are un singur parametru care se referă la eveniment. În cazul nostru, parametrul va fi de tip ChargingEvent
.
Tot ceea ce facem în această metodă este să adăugăm ultimul mesaj primit conținutului TextView
. Punerea în aplicare a directivei onEvent
metoda arată astfel:
public void onEvent (eveniment ChargingEvent) view.setText (view.getText () + "\ n" + event.getData ());
Aplicația este acum gata să fie testată. Compilați-l și rulați-l pe un dispozitiv fizic Android. Odată ce aplicația a terminat de lansat, conectați și deconectați cablul de alimentare de câteva ori pentru a vedea modificarea stării de încărcare.
În acest tutorial, ați învățat cum să utilizați biblioteca EventBus și cât de mult simplifică comunicarea între clase. Biblioteca este optimizată pentru platforma Android și este foarte ușoară. Acest lucru înseamnă că îl puteți utiliza în proiectele dvs. fără să vă faceți griji cu privire la dimensiunea aplicației dvs. Pentru a afla mai multe despre biblioteca EventBus, vizitați proiectul pe GitHub.