En typisk Android-app har en tendens til å være sammensatt av mange lag, moduler eller strukturer som Fragments, Activities, Presenters og Services. Effektiv kommunikasjon mellom disse komponentene kan bli vanskelig hvis de er tett koblet sammen.
I det nedre nivået av apparkitekturen din, for eksempel databasen, kan det hende du vil sende data til et høyere nivå, for eksempel visningen, når det skjer en handling. For å gjøre dette, vil du kanskje opprette et lyttergrensesnitt, asynk-oppgaver eller tilbakeringinger. Alle disse vil fungere, men de har noen store ulemper:
Ved å bruke publiserings- / abonnements- eller meldingsbussar, forhindrer arkitektur alle potensielle problemer fremhevet ovenfor. Det er en veldig god måte å implementere effektiv kommunikasjon mellom komponenter i et program uten at noen av dem trenger å være oppmerksomme på de andre umiddelbart. Ved hjelp av publisering / abonnement i Android kan enhver app-komponent publisere hendelser som den overfører til bussen, og de relevante forbrukerne kan forbruke eller abonnere på dem.
For å bruke greenrobot EventBus må du først legge den til i app-modulet build.gradle fil, inkludere kompilere 'org.greenrobot:
eventbus
: 3.0.0'
, og synkroniser deretter prosjektet etterpå.
En abonnent abonnerer bare på en begivenhet ved å registrere seg i hendelsesbussen og kan også avregistrere den hendelsen. For å være abonnent må du gjøre tre hovedtyper:
1. Registrer abonnenten i hendelsesbussen med registrere()
. Dette informerer hendelsesbussen som du vil begynne å motta hendelser. I en aktivitet er dette i onStart ()
metode, mens i et fragment sett dette i onAtact (Aktivitetsaktivitet)
metode.
@Override public void onStart () super.onStart (); . EventBus.getDefault () register (this);
2. Avmeld abonnenten, som betyr at arrangementsbussen stopper å sende meg hendelser. I en aktivitet er dette i onStop ()
metode, mens i et fragment sett dette i onDetach ()
metode.
@Override public void onStop () super.onStop (); . EventBus.getDefault () avregistrere (this);
3. Implementere onEvent ()
for å angi hvilken type arrangement du vil motta, og tiltak som skal tas når du mottar hendelsen. Legg merke til @Abonnere
annotasjon øverst på denne metoden. I dette tilfellet ønsker vi å abonnere på en vanlig hendelse og ikke en klebrig en. Jeg forklarer forskjellen senere.
@Subscribe public void onEvent (MessageEvent-hendelse) Toast.makeText (dette, "Hei, min melding" + event.getMessage (), Toast.LENGTH_SHORT) .show () ;.
Hendelsene i greenrobot EventBus er bare objekter du definerer. Du kan ha forskjellige hendelsesklasser hvis du vil. De arver ikke noen grunnklasse eller grensesnitt-de er bare POJO (Vanlige gamle Java-objekter).
offentlig klasse MessageEvent public String mMessage; offentlig MessageEvent (strengmelding) mMessage = message; offentlig String getMessage () return mMessage;
Hovedforskjellen mellom posthendelse og post-klebrig hendelse er cachemekanismen som brukes i hendelsesbussen. Når noen legger inn en klebrig begivenhet, lagres denne hendelsen i en cache. Når en ny aktivitet eller et fragment abonnerer på hendelsesbussen, blir det den siste klebrig hendelsen fra hurtigbufferen i stedet for å vente på at den blir sparket igjen til arrangementsbussen - slik at denne hendelsen forblir i hurtigbufferen selv etter at en abonnent har fått det.
Sticky hendelser er lagt ut med postSticky (MessageEvent)
metode, og ikke-klebrig hendelser med post (MessageEvent)
metode.
EventBus.getDefault (). PostSticky (new MessageEvent ("Hey event abonnent!")); EventBus.getDefault (). Post (new MessageEvent ("Hey event abonnent!"));
For en vanlig, ikke-klebrig begivenhet, hvis det ikke finnes noen abonnent, blir arrangementet kastet bort. En klebrig begivenhet vil bli cached, skjønt, hvis en abonnent kommer sammen senere.
Så når bestemmer du deg for å bruke post-klebrig hendelse? Du kan gjøre dette hvis du sporer ned brukerens plassering, eller for enkel caching av data, sporing av batterinivåer, osv.
EventBus.getDefault (). PostSticky (new LocationReceivedEvent (6.4531, 3.3958))
// UI oppdateringer må kjøres på MainThread @Subscribe (sticky = true, threadMode = ThreadMode.MAIN) offentlig tomgang onEvent (MessageEvent-hendelse) textField.setText (event.getMessage ());
For å abonnere på en klebrig begivenhet, inkluderer du klebrig = sant
inne i @Abonnere
merknad. Dette indikerer at vi ønsker å få en klebrig hendelse av typen MessageEvent
fra hurtigbufferen.
LocationReceivedEvent locationReceivedStickyEvent = EventBus.getDefault (). GetStickyEvent (LocationReceived.class); hvis (stickyEvent! = null) EventBus.getDefault (). removeStickyEvent (locationReceivedStickyEvent);
removeStickyEvent (Hendelse)
fjerner en klebrig hendelse fra hurtigbufferen, og removeAllStickyEvents ()
vil fjerne alle klebrig hendelser.
Det er fire trådmoduser tilgjengelig for abonnenter å velge mellom: innlegg, hoved, bakgrunn og asynk.
@Subscribe (threadMode = ThreadMode.POSTING)
Dette er standard. Abonnenter vil bli kalt i samme tråd som tråden der arrangementet blir lagt ut. Gjelder også ThreadMode.POSTING
i din @Abonnere
merknad er valgfri.
@Subscribe (threadMode = ThreadMode.MAIN)
I denne trådmodusen mottar abonnenter hendelser i hovedbruddstråden, uansett hvor hendelsen ble lagt ut. Dette er trådmodusen som skal brukes hvis du vil oppdatere brukergrensesnittelementer som følge av hendelsen.
@Subscribe (threadMode = ThreadMode.BACKGROUND)
I denne trådmodusen vil abonnenter motta hendelser i samme tråd der de blir lagt ut, akkurat som for ThreadMode.POSTING
. Forskjellen er at hvis hendelsen legges opp i hovedtråden, vil abonnenter istedet få dem på en bakgrunnstråd. Dette sørger for at hendelseshåndtering ikke blokkerer appens brukergrensesnitt. Fortsett ikke kjør en operasjon som vil ta lang tid på denne tråden.
@Subscribe (threadMode = ThreadMode.ASYNC)
I denne trådmodusen vil abonnenter alltid motta hendelser uavhengig av gjeldende tråd og hovedtråd. Dette gjør at abonnentene kan kjøre på en egen tråd. Dette er nyttig for langdriftsoperasjoner som nettverksoperasjoner.
Hvis du vil endre rekkefølgen der abonnenter får hendelser, må du angi prioritetsnivåene under registrering. Abonnenter med høyere prioritet får hendelsen før abonnenter med lavere prioritet. Dette påvirker bare abonnenter i samme trådmodus. Merk at standardprioriteten er 0.
@Subscribe (prioritet = 1); Offentlig tomgang onEvent (MessageEvent-hendelse) textField.setText (event.getMessage ());
Hvis du vil stoppe en begivenhet fra å bli levert til andre abonnenter, ring cancelEventDelivery (Object hendelse)
metode innenfor abonnentens hendelseshåndteringsmetode.
@Subscribe public void onEvent (MessageEvent-hendelse) EventBus.getDefault (). CancelEventDelivery (hendelse);
I denne veiledningen lærte du om:
For å lære mer om greenrobot EventBus foreslår jeg at du besøker den offisielle dokumentasjonen.
Et annet bibliotek du kan bruke til å implementere en hendelse buss er RxAndroid. Se vår artikkel om RxAndroid her på Envato Tuts +, eller prøv noen av våre andre Android-kurs eller opplæringsprogrammer..