Comunicare în cadrul unei aplicații Android cu EventBus

O aplicație tipică pentru Android tinde să fie compusă din mai multe straturi, module sau structuri, cum ar fi fragmente, activități, prezentatori și servicii. Comunicarea eficientă între aceste componente poate deveni dificilă dacă acestea sunt strâns legate între ele. 

În nivelul inferior al arhitecturii aplicației, cum ar fi baza de date, atunci când se întâmplă o acțiune, este posibil să doriți să trimiteți date la un nivel superior, cum ar fi vizualizarea. Pentru a face acest lucru, este posibil să doriți să creați o interfață de ascultător, să asociați sarcini sau apeluri de apel. Toate acestea vor funcționa, dar au unele dezavantaje majore:

  1. directă sau strânsă
  2. înregistrarea și neînregistrarea mai multor dependențe în mod individual
  3. repetarea codului
  4. dificultate în testare
  5. risc crescut de bug-uri

Utilizarea arhitecturii de publicare / abonare sau a magistralei de mesaje previne toate problemele potențiale evidențiate mai sus. Este o modalitate foarte bună de a implementa comunicări eficiente între componente într-o aplicație, fără ca oricare dintre aceștia să fie nevoiți să fie conștienți de ceilalți imediat. Folosind publicarea / abonarea în Android, orice componentă a aplicației poate publica evenimente pe care le va transmite autobuzului, iar consumatorii relevanți îi pot consuma sau se pot abona la acestea. 

Pentru a folosi GreenBot EventBus, trebuie să o adăugați mai întâi în modulul app build.gradle fișier, includeți compile 'org.greenrobot:eventbus: 3.0.0', apoi sincronizați apoi proiectul. 

Un abonat la eveniment

Un abonat subscrie pur și simplu la un eveniment prin înregistrarea în autobuzul evenimentului și poate, de asemenea, să anuleze înregistrarea evenimentului. Pentru a fi abonat, trebuie să faceți trei lucruri principale:

1. Înregistrați abonatul în busul de evenimente cu Inregistreaza-te(). Aceasta informează busul de evenimente pe care doriți să începeți să primiți evenimente. Într - o activitate, aceasta este în onStart () metoda, în timp ce într-un fragment pune acest lucru în onAttact (Activitate de activitate) metodă. 

@Override publică void onStart () super.onStart (); . EventBus.getDefault () registru (aceasta); 

2. Anulați înregistrarea abonatului, ceea ce înseamnă că autobuzul evenimentului nu vă mai trimite evenimente. Într - o activitate, aceasta este în onStop () metoda, în timp ce într-un fragment pune acest lucru în onDetach () metodă. 

@Override publice void onStop () super.onStop (); . EventBus.getDefault () anulați înregistrarea (aceasta); 

3. Implementați onEvent () pentru a indica tipul de eveniment pe care doriți să îl primiți și acțiunile de întreprins când primiți evenimentul. Observați @Abonati-va adnotare în partea de sus a acestei metode. În acest caz, dorim să ne abonați la un eveniment normal și nu la unul lipicios - o să explic mai târziu diferența.

@Înscrieți public void onEvent (eveniment MessageEvent) Toast.makeText (aceasta, "Hei, mesajul meu" + event.getMessage (), Toast.LENGTH_SHORT) .show () ;. 

Definirea mesajelor de evenimente

Evenimentele din GreenBot EventBus sunt doar obiecte pe care le definiți. Puteți să aveți diferite clase de evenimente dacă doriți. Ei nu moștenesc nici o clasă de bază sau o interfață - sunt doar POJO (obiecte obișnuite Java vechi). 

clasa publică MessageEvent public String mMessage; public MessageEvent (mesaj String) mMessage = message;  public String getMessage () întoarcere mMessage; 

Evenimentul post și Evenimentul Post Sticky

Principala diferență între evenimentul post și evenimentul post-lipicioasă este mecanismul de cache utilizat în interiorul magistralei de evenimente. Când cineva publică un eveniment lipicioasă, acest eveniment este stocat într-o memorie cache. Atunci când o nouă activitate sau un fragment se abonează la magistrala evenimentului, acesta primește ultimul eveniment lipicios din memoria cache, în loc să aștepte ca acesta să fie declanșat din nou în bus-ul evenimentului - astfel încât evenimentul să rămână în memoria cache chiar și după ce un abonat a primit-o. 

Evenimentele importante sunt afișate cu postSticky (MessageEvent) metodă și evenimente non-lipicioase cu post (MessageEvent) metodă.

EventBus.getDefault () postSticky (noul MessageEvent ("Hey subscriber event!")); EventBus.getDefault () post (nou MessageEvent ("Hey subscriber event!"));

Pentru un eveniment regulat, non-lipicios, dacă nu există un abonat, evenimentul va fi aruncat. Un eveniment lipicioasă va fi stocat în memoria cache, deși în cazul în care abonatul va veni mai târziu.

Deci, când decideți să utilizați evenimentul post-lipicios? Puteți face acest lucru dacă urmăriți locația utilizatorului sau pentru o cacheare ușoară a datelor, urmărirea nivelului bateriei etc.. 

EventBus.getDefault () postSticky (locație newReceivedEvent (6.4531, 3.3958))

Abonați-vă la Evenimentul Sticky Post

// actualizările UI trebuie să ruleze pe MainThread @Subscribe (sticky = true, threadMode = ThreadMode.MAIN) public void onEvent (eveniment MessageEvent) textField.setText (event.getMessage ()); 

Pentru a vă abona la un eveniment lipicios, includeți lipicios = adevăratîn interiorul @Abonati-va adnotare. Acest lucru indică faptul că dorim să primim un eveniment lipicioase de tip MessageEvent din cache. 

Eliminarea evenimentelor Sticky

LocațiePrimitEvent locațieReceivedStickyEvent = EventBus.getDefault (). GetStickyEvent (LocationReceived.class); dacă (stickyEvent! = null) EventBus.getDefault (). removeStickyEvent (locationReceivedStickyEvent); 

removeStickyEvent (Eveniment) elimină un eveniment lipicios din memoria cache și removeAllStickyEvents () va elimina toate evenimentele lipicioase. 

EventBus Moduri de Thread

Există patru moduri de fir disponibile pentru abonați, dintre care puteți alege: postare, principală, fundal și asincronă.

postare

@Subscribe (threadMode = ThreadMode.POSTING)

Acesta este setarea implicită. Abonații vor fi chemați în același fir cu firul în care este postat evenimentul. Inclusiv ThreadMode.POSTING în tine @Abonati-va adnotarea este opțională. 

Principal 

@Subscribe (threadMode = ThreadMode.MAIN)

În acest mod de thread, abonații vor primi evenimente în firul principal de interfață, indiferent unde a fost postat evenimentul. Acesta este modul de fir care trebuie utilizat dacă doriți să actualizați elementele UI ca rezultat al evenimentului.

fundal

@Subscribe (threadMode = ThreadMode.BACKGROUND)

În acest mod de thread, abonații vor primi evenimente în același fir pe care sunt postate, la fel ca pentru ThreadMode.POSTING. Diferența este că, dacă evenimentul este postat în firul principal, atunci abonații îi vor primi în schimb pe un fir de fundal. Astfel, manipularea evenimentelor nu blochează interfața de utilizare a aplicației. Totuși, nu executați o operațiune care va dura mult timp pe acest fir. 

async

@Subscribe (threadMode = ThreadMode.ASYNC)

În acest mod de thread, abonații vor primi întotdeauna evenimente independent de firul curent și firul principal. Aceasta permite abonaților să ruleze pe un fir separat. Acest lucru este util pentru operațiile de lungă durată, cum ar fi operațiile de rețea. 

Prioritățile abonaților 

Dacă doriți să modificați ordinea în care abonații primesc evenimente, atunci trebuie să specificați nivelurile de prioritate în timpul înregistrării. Abonații cu o prioritate mai mare primesc evenimentul înaintea abonaților cu o prioritate mai mică. Acest lucru afectează numai abonații în același mod de fire. Rețineți că prioritatea implicită este 0. 

@Subscrieți (prioritate = 1); public void onEvent (eveniment MessageEvent) textField.setText (event.getMessage ()); 

Anularea evenimentelor

Dacă doriți să opriți difuzarea unui eveniment către alți abonați, apelați cancelEventDelivery (eveniment Object) în cadrul metodei de tratare a evenimentelor de către abonat. 

@Subscrie public void onEvent (eveniment MessageEvent) EventBus.getDefault () cancelEventDelivery (eveniment); 

Concluzie

În acest tutorial, ați aflat despre:

  • greenrobot EventBus și cum poate îmbunătăți aplicația Android
  • diferența dintre evenimentele obișnuite și cele lipicioase
  • diferitele moduri de fir disponibile și când să le folosiți pe fiecare
  • prioritățile abonaților
  • anularea unui eveniment pentru a nu mai primi evenimente

Pentru a afla mai multe despre GreenBot EventBus, vă sugerăm să vizitați documentația oficială.

O altă bibliotecă pe care o puteți utiliza pentru implementarea unui bus de evenimente este RxAndroid. Consultați articolul nostru despre RxAndroid aici pe Envato Tuts + sau încercați câteva dintre celelalte cursuri sau tutoriale Android.

  • Noțiuni de bază cu ReactiveX pe Android

    Baza de coduri a aplicațiilor complexe cu multe conexiuni de rețea și interacțiuni cu utilizatorii sunt adesea încărcate cu apeluri de apel. Un astfel de cod nu este doar lung și greu de ...
    Ashraff Hathibelagal
    Android
  • O introducere în Loopj

    În acest tutorial, veți învăța să folosiți Loopj, o bibliotecă ușor de utilizat pentru cererile HTTP în Android. Pentru a vă ajuta să învățați, vom folosi Loopj pentru a crea ...
    Pedro Gonzalez Ferrandez
    Android Studio
  • Android de la zero: Înțelegerea emisiunilor Android

    În acest tutorial, veți învăța cum să creați, să trimiteți și să primiți atât emisiuni la nivel local, cât și la nivel de sistem. Veți învăța, de asemenea, cum să utilizați o companie terță populară ...
    Ashraff Hathibelagal
    Android SDK
  • Animați aplicația Android

    Animațiile au devenit o parte importantă a experienței utilizatorilor Android. Subtilă, animație artizanală este folosită în întregul sistem Android și poate face ...
    Ashraff Hathibelagal
    Dezvoltarea mobilă
Cod