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:
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 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 () ;.
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;
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))
// 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.
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.
Există patru moduri de fir disponibile pentru abonați, dintre care puteți alege: postare, principală, fundal și asincronă.
@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ă.
@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.
@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.
@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.
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 ());
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);
În acest tutorial, ați aflat despre:
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.