Kommunikasjon innenfor en Android-app med EventBus

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:

  1. direkte eller tett kobling
  2. registrere og avregistrere flere avhengigheter individuelt
  3. gjentakelse av kode
  4. problemer med testing
  5. økt risiko for feil

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 hendelses abonnent

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 () ;. 

Definere hendelsesmeldinger

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; 

Post Event og Post Sticky Event

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))

Abonner på Post Sticky Event

// 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 = santinne i @Abonnere merknad. Dette indikerer at vi ønsker å få en klebrig hendelse av typen MessageEvent fra hurtigbufferen. 

Fjerner klistrede hendelser

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. 

EventBus trådmoduser

Det er fire trådmoduser tilgjengelig for abonnenter å velge mellom: innlegg, hoved, bakgrunn og asynk.

Poste

@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. 

Hoved 

@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.

Bakgrunn

@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. 

Async

@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. 

Abonnentprioriteter 

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 ()); 

Avbryter hendelser

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); 

Konklusjon

I denne veiledningen lærte du om:

  • greenrobot EventBus og hvordan det kan forbedre Android-appen din
  • forskjellen mellom vanlige og klebrig hendelser
  • de forskjellige trådmodusene er tilgjengelige og når du skal bruke hver enkelt
  • abonnentprioriteter
  • kansellerer en hendelse for å slutte å motta hendelser

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..

  • Komme i gang med ReactiveX på Android

    Kodebase av komplekse apper med mange nettverkstilkoblinger og brukerinteraksjoner er ofte fylt med tilbakekallinger. Slik kode er ikke bare lang og vanskelig å ...
    Ashraff Hathibelagal
    Android
  • En introduksjon til Loopj

    I denne opplæringen lærer du å bruke Loopj, et brukervennlig bibliotek for HTTP-forespørsler i Android. For å hjelpe deg med å lære, skal vi bruke Loopj for å lage ...
    Pedro Gonzalez Ferrandez
    Android Studio
  • Android fra scratch: Forstå Android Broadcasts

    I denne opplæringen lærer du hvordan du oppretter, sender og mottar både lokale og systembaserte sendinger. Du lærer også hvordan du bruker en populær tredjepart ...
    Ashraff Hathibelagal
    Android SDK
  • Animer Android-appen din

    Animasjoner har blitt en viktig del av Android-brukeropplevelsen. Subtil, godt utformet animasjon brukes i hele Android OS og kan gjøre din ...
    Ashraff Hathibelagal
    Mobil utvikling