Å bygge en Android-app som har flere aktive komponenter som kommuniserer med hverandre, kan bli kjedelig. For å spare tid, utvikler utviklerne ofte tett koblede komponenter i sine apper. EventBus er et populært åpen kildebibliotek som ble opprettet for å løse dette problemet ved hjelp av utgiver / abonnent mønster.
Ved hjelp av EventBus-biblioteket kan du sende meldinger fra en klasse til en eller flere klasser på bare noen få linjer med kode. Videre er alle involverte klasser helt avkoblet fra hverandre, noe som fører til kode som er mindre kompleks og enklere å vedlikeholde og feilsøke.
I dette raske tipset skal du lære hvordan du bruker EventBus-biblioteket ved å bygge et enkelt Android-program som viser ladestatusen til enheten. Fordi endringer i ladestatus er systemhendelser, vil appen ha en Aktivitet
som trenger å motta informasjon fra en BroadcastReceiver
-Det perfekte scenariet for å bruke en eventbuss.
Kontroller at du har Eclipse ADT Bundle satt opp. Du kan laste den ned fra Android Developer-nettstedet.
Start Eclipse og opprett et nytt Android-program. Navn søknaden EventBusSample
. Velg et unikt pakke navn og sett inn Minimumskrav SDK til Android 2.2 og Mål SDK til Android 4.4.
Vi skal lage Aktivitet
oss selv, så avvelg Opprett aktivitet og klikk Bli ferdig.
Denne appen har en BroadcastReceiver
som reagerer på følgende handlinger:
android.intent.action.ACTION_POWER_CONNECTED
android.intent.action.ACTION_POWER_DISCONNECTED
Navn på BroadcastReceiver
ChargingReceiver
og erklære det i AndroidManifest.xml
fil.
Appen har en Aktivitet
for å vise ladestatus. Navngi det DisplayActivity
og erklære det som vist nedenfor.
Last ned den nyeste versjonen av EventBus-biblioteket som en JAR fra Maven Central og legg til JAR i prosjektets libs
katalog.
ChargingEvent
KlasseHendelser på arrangementsbussen er ingenting annet enn gjenstander som inneholder informasjonen som må kommuniseres. La ChargingEvent
vær navnet på klassen som inneholder informasjonen som er sendt fra BroadcastReceiver
til Aktivitet
. Dette er en enkel klasse som bare har en string
å representere informasjonen. Det har også en konstruktør å sette verdien av strengen og en accessor for å få sin verdi.
Opprett en ny fil som heter ChargingEvent.java og legg til følgende kode for det:
pakke com.hathy.eventbussample; offentlig klasse ChargingEvent private String data; offentlig ChargingEvent (String data) this.data = data; offentlig String getData () return data;
BroadcastReceiver
KlasseOpprett en ny klasse som heter ChargingReceiver
som strekker seg BroadcastReceiver
. Denne klassen bruker hendelsesbussen til å publisere meldinger. Den har en variabel som heter buss
, som refererer til bussen som er opprettet av EventBus-biblioteket. Bussen er en singleton og du må bruke getDefault
metode for å referere til det.
I OnReceive
Metode, vi lager en ny forekomst av ChargingEvent
klasse og legg til vår melding til den. Her er en prøvemelding:
@ 14: 23: 20 denne enheten startet lading.
For å generere denne meldingen må vi gjøre følgende:
Tid
klasse for å angi tidspunktet for hendelsen.Intent.ACTION_POWER_CONNECTED
, enheten lades. Hvis det er Intent.ACTION_POWER_DISCONNECTED
, enheten slipper ut.Først når ChargingEvent
objektet har riktig informasjon, den er publisert på arrangementsbussen ved hjelp av post
metode. Gjennomføringen av ChargingReceiver
klassen skal nå se slik ut:
pakke com.hathy.eventbussample; importer de.greenrobot.event.EventBus; importer android.content.BroadcastReceiver; importer android.content.Context; importer android.content.Intent; importer android.text.format.Time; offentlig klasse ChargingReceiver utvider BroadcastReceiver private EventBus bus = EventBus.getDefault (); @Override public void onReceive (Kontekst kontekst, hensikt) ChargingEvent event = null; // Få nåværende tid Tid nå = ny Tid (); now.setToNow (); String timeOfEvent = now.format ("% H:% M:% S"); String eventData = "@" + timeOfEvent + "denne enheten startet"; hvis (intent.getAction () er lik (Intent.ACTION_POWER_CONNECTED)) event = new ChargingEvent (eventData + "lading."); annet hvis (intent.getAction (). likestiller (Intent.ACTION_POWER_DISCONNECTED)) event = new ChargingEvent (eventData + "discharge."); // Post hendelsen bus.post (event);
Som du ser, publiserer meldinger til arrangementsbussen bare en enkelt kode. Videre trenger utgiveren ikke å vite noe om abonnenten (e).
DisplayActivity
KlasseOpprett en ny klasse som heter DisplayActivity
. Denne klassen er ansvarlig for å vise meldingene til hendelsene som er publisert på arrangementsbussen.
Denne klassen har også en variabel som refererer til arrangementsbussen. Som EventBus-biblioteket følger singleton-mønsteret, er forekomsten av arrangementsbussen tilgjengelig for dette Aktivitet
er det samme som forekomsten tilgjengelig for BroadcastReceiver
.
For å tillate en klasse å abonnere på hendelser på bussen, vil registrere
Metoden er påkalt. I vår Aktivitet
, vi kaller det i onCreate
metode.
På samme måte, for å slutte å motta hendelser, avregistrere
Metoden er påkalt. Vi kaller denne metoden i onDestroy
Metode for å sikre at alle ressurser frigjøres.
De Aktivitet
har en veldig grunnleggende layout, som bare inneholder en TextView
som viser meldingene. Det er derfor ikke nødvendig å lage et oppsett for det. Vi bruker bare TextView
som innholdsvisning av Aktivitet
.
På dette punktet implementeringen av DisplayActivity
klassen skal se slik ut:
pakke com.hathy.eventbussample; importer android.app.Activity; importere android.os.Bundle; importer android.widget.TextView; importer de.greenrobot.event.EventBus; offentlig klasse DisplayActivity utvider Aktivitet privat EventBus bus = EventBus.getDefault (); privat tekstvisning; @Override protected void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState); view = new TextView (dette); view.setTextSize (20F); view.setPadding (20, 20, 20, 20); view.setText ("Venter på hendelser ..."); setContentView (syn); // Registrer som abonnent bus.register (dette); @Override protected void onDestroy () // Avregistrer bus.unregister (dette); super.onDestroy ();
Hver klasse som har tenkt å motta hendelser fra arrangementsbussen, skal inneholde en onEvent
metode. Navnet på denne metoden er viktig, fordi EventBus-biblioteket bruker Java Reflection API for å få tilgang til denne metoden. Den har en enkelt parameter som refererer til arrangementet. I vårt tilfelle vil parameteren være av typen ChargingEvent
.
Alt vi gjør i denne metoden, legger til siste mottatte melding til innholdet i TextView
. Gjennomføringen av onEvent
Metoden ser slik ut:
Offentlig tomgang onEvent (ChargingEvent-hendelse) view.setText (view.getText () + "\ n" + event.getData ());
Appen er nå klar til å bli testet. Kompilere og kjøre den på en fysisk Android-enhet. Når appen er ferdig med å starte, plugg og koble strømledningen et par ganger for å se ladestatusendringen.
I denne opplæringen har du lært hvordan du bruker EventBus-biblioteket og hvor mye det forenkler kommunikasjonen mellom klassene. Biblioteket er optimalisert for Android-plattformen og er veldig lett. Dette betyr at du kan bruke den i prosjektene dine uten å måtte bekymre deg for størrelsen på appen din. For å lære mer om EventBus-biblioteket, besøk prosjektet på GitHub.