Het bouwen van een Android-app met meerdere actieve componenten die met elkaar communiceren, kan vervelend worden. Om tijd te besparen, hebben ontwikkelaars vaak last van nauw gekoppelde componenten in hun apps. EventBus is een populaire open-sourcebibliotheek die is gemaakt om dit probleem op te lossen met behulp van de uitgever / abonnee patroon.
Met behulp van de EventBus-bibliotheek kunt u berichten van één klasse naar één of meerdere klassen doorgeven in slechts enkele regels code. Bovendien zijn alle betrokken klassen volledig van elkaar losgekoppeld, wat leidt tot code die minder complex is en gemakkelijker te onderhouden en te debuggen.
In deze snelle tip leert u hoe u de EventBus-bibliotheek gebruikt door een eenvoudige Android-applicatie te bouwen die de laadstatus van het apparaat weergeeft. Omdat veranderingen in de laadstatus systeemgebeurtenissen zijn, krijgt de app een Activiteit
die informatie van een moet ontvangen Uitzending ontvanger
-het perfecte scenario voor het gebruik van een evenementenbus.
Zorg ervoor dat u de Eclipse ADT-bundel hebt ingesteld. Je kunt het downloaden van de Android Developer-website.
Start Eclipse en maak een nieuwe Android-applicatie. Geef de applicatie een naam EventBusSample
. Kies een unieke pakketnaam en stel de Minimaal vereiste SDK naar Android 2.2 en de Target SDK naar Android 4.4.
We gaan het maken Activiteit
onszelf, dus maak de selectie ongedaan Activiteit maken en klik Af hebben.
Deze app heeft er een Uitzending ontvanger
die reageert op de volgende acties:
android.intent.action.ACTION_POWER_CONNECTED
android.intent.action.ACTION_POWER_DISCONNECTED
Noem de Uitzending ontvanger
ChargingReceiver
en verklaar het in de AndroidManifest.xml
het dossier.
De app heeft er een Activiteit
om de laadstatus weer te geven. Noem maar op DisplayActivity
en verklaar het zoals hieronder getoond.
Download de nieuwste versie van de EventBus-bibliotheek als een JAR van Maven Central en voeg de JAR toe aan uw project libs
directory.
ChargingEvent
KlasseGebeurtenissen op de gebeurtenisbus zijn niets anders dan objecten die de informatie bevatten die moet worden gecommuniceerd. Laat ChargingEvent
de naam zijn van de klasse die de informatie bevat die is doorgegeven van de Uitzending ontvanger
naar de Activiteit
. Dit is een eenvoudige klasse die alleen een Draad
om de informatie te vertegenwoordigen. Het heeft ook een constructor om de waarde van de string en een accessor in te stellen om de waarde ervan te krijgen.
Maak een nieuw bestand met de naam ChargingEvent.java en voeg de volgende code eraan toe:
pakket com.hathy.eventbussample; public class ChargingEvent private String-gegevens; openbaar ChargingEvent (String-gegevens) this.data = data; public String getData () retourgegevens;
Uitzending ontvanger
KlasseMaak een nieuwe klasse met de naam ChargingReceiver
dat breidt zich uit Uitzending ontvanger
. Deze klasse gebruikt de gebeurtenisbus om berichten te publiceren. Het heeft een variabele met de naam bus
, die verwijst naar de bus die is gemaakt door de EventBus-bibliotheek. De bus is een singleton en je moet de getDefault
methode om ernaar te verwijzen.
In de onReceive
methode, maken we een nieuw exemplaar van de ChargingEvent
klasse en voeg onze boodschap eraan toe. Hier is een voorbeeldbericht:
@ 14: 23: 20 dit apparaat begon op te laden.
Om dit bericht te genereren, moeten we het volgende doen:
Tijd
klasse om het tijdstip in te stellen waarop de gebeurtenis plaatsvond.Intent.ACTION_POWER_CONNECTED
, het apparaat laadt op. Als het is Intent.ACTION_POWER_DISCONNECTED
, het apparaat is bezig met ontladen.Zodra de ChargingEvent
object heeft de juiste informatie, het wordt gepubliceerd op de gebeurtenisbus met behulp van de post
methode. De implementatie van de ChargingReceiver
klasse zou er nu als volgt uit moeten zien:
pakket com.hathy.eventbussample; import de.greenrobot.event.EventBus; import android.content.BroadcastReceiver; importeer android.content.Context; importeer android.content.Intent; importeer android.text.format.Time; openbare klasse ChargingReceiver breidt BroadcastReceiver uit private EventBus-bus = EventBus.getDefault (); @Override public void onReceive (Context context, Intent intent) ChargingEvent event = null; // Krijg huidige tijd Tijd nu = nieuwe tijd (); now.setToNow (); String timeOfEvent = now.format ("% H:% M:% S"); String eventData = "@" + timeOfEvent + "dit apparaat is gestart"; if (intent.getAction (). equals (Intent.ACTION_POWER_CONNECTED)) event = new ChargingEvent (eventData + "charging."); else if (intent.getAction (). equals (Intent.ACTION_POWER_DISCONNECTED)) event = new ChargingEvent (eventData + "ontladen."); // Post de gebeurtenis bus.post (evenement);
Zoals je kunt zien, kost het publiceren van berichten naar de gebeurtenisbus slechts één regel code. Bovendien hoeft de uitgever niets te weten over de abonnee (s).
DisplayActivity
KlasseMaak een nieuwe klasse met de naam DisplayActivity
. Deze klasse is verantwoordelijk voor het weergeven van de berichten van de evenementen die zijn gepubliceerd op de gebeurtenisbus.
Deze klasse heeft ook een variabele die verwijst naar de gebeurtenisbus. Omdat de EventBus-bibliotheek het singleton-patroon volgt, is de instantie van de gebeurtenisbus hiertoe beschikbaar Activiteit
is hetzelfde als het exemplaar dat beschikbaar is voor de Uitzending ontvanger
.
Om een klasse in staat te stellen zich te abonneren op evenementen op de bus, moet de registreren
methode wordt aangeroepen. In onze Activiteit
, we noemen het in de onCreate
methode.
Evenzo, om te stoppen met het ontvangen van evenementen, de uitschrijven
methode wordt aangeroepen. We noemen deze methode in de onDestroy
methode om ervoor te zorgen dat alle middelen vrij zijn.
De Activiteit
heeft een heel eenvoudige lay-out, met alleen een Tekstweergave
die de berichten weergeeft. Het is daarom niet nodig om er een lay-out voor te maken. We gebruiken gewoon de Tekstweergave
als de inhoudsopgave van de Activiteit
.
Op dit punt is de implementatie van de DisplayActivity
klasse zou er als volgt uit moeten zien:
pakket com.hathy.eventbussample; import android.app.Activity; import android.os.Bundle; import android.widget.TextView; import de.greenrobot.event.EventBus; public class DisplayActivity breidt activiteit uit private EventBus-bus = EventBus.getDefault (); privé TextView-weergave; @Override protected void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState); view = nieuwe TextView (this); view.setTextSize (20f); view.setPadding (20, 20, 20, 20); view.setText ("Wachten op gebeurtenissen ..."); setContentView (view); // Registreer als een abonnee bus.register (dit); @Override protected void onDestroy () // Maak bus.unregister (dit) ongedaan; super.onDestroy ();
Elke klas die van plan is evenementen van de evenementenbus te ontvangen, moet een onevent
methode. De naam van deze methode is belangrijk, omdat de EventBus-bibliotheek de Java Reflection API om toegang te krijgen tot deze methode. Het heeft een enkele parameter die naar de gebeurtenis verwijst. In ons geval zal de parameter van het type zijn ChargingEvent
.
Alles wat we doen in deze methode is het laatst ontvangen bericht toevoegen aan de inhoud van de Tekstweergave
. De implementatie van de onevent
methode ziet er als volgt uit:
public void onEvent (ChargingEvent event) view.setText (view.getText () + "\ n" + event.getData ());
De app is nu klaar om te worden getest. Compileer en voer het uit op een fysiek Android-apparaat. Nadat de app is opgestart, koppelt u het netsnoer een paar keer los en trekt u de stekker uit het stopcontact om de laadstatus te wijzigen.
In deze zelfstudie hebt u geleerd hoe u de EventBus-bibliotheek gebruikt en hoeveel deze de communicatie tussen klassen vereenvoudigt. De bibliotheek is geoptimaliseerd voor het Android-platform en is erg lichtgewicht. Dit betekent dat u het in uw projecten kunt gebruiken zonder u zorgen te hoeven maken over de grootte van uw app. Bezoek het project op GitHub voor meer informatie over de EventBus-bibliotheek.