RoboGuice, de asemenea, numit Google Guice pe Android, este un cadru de injecție de dependență ușor de folosit, care poate face dezvoltarea Android mai intuitivă și mai convenabilă. Folosind acest cadru, puteți reduce drastic cantitatea de cod pe care o scrieți pentru a efectua sarcini comune, cum ar fi inițializarea diferitelor resurse, accesarea serviciilor de sistem Android și gestionarea evenimentelor.
În acest tutorial, vă voi arăta cum să profitați la maximum de RoboGuice 3 în proiectele Android.
În mod tradițional, dacă un obiect depinde de ceva, este propria responsabilitate să satisfacem această dependență. În termeni mai simpli, dacă o instanță a clasei A depinde de o instanță a clasei B, atunci dezvoltatorul este de obicei de așteptat să numească constructorul din clasa B în interiorul codului clasei A. Acest lucru duce în mod evident la o cuplare mai strânsă între cele două clase.
Injecția de dependență este un model de proiectare în care obiectele se bazează pe codul extern, denumit în mod obișnuit ca injector de dependență, pentru a-și satisface dependențele. Aceasta înseamnă că, dacă un obiect depinde de alte obiecte, nu trebuie să știe cum să creeze sau să inițializeze acele obiecte. Acest lucru reduce legătura dintre obiecte și duce la un cod mai modular, mai ușor de modificat și mai puțin complex pentru a fi testat.
Astfel, prin utilizarea injecției de dependență, puteți să eliminați în mare măsură constructorii și metodele din fabrică în logica de afaceri a proiectului dvs..
Google Guice este un cadru care vă facilitează crearea, configurarea și utilizarea unui injector de dependență în proiectele dvs. Java. RoboGuice se bazează pe Google Guice și vine cu un injector de dependență pre-configurat pentru Android. Pur și simplu pus, din cutie, RoboGuice știe cum să inițializeze diferite obiecte Android, să se refere la diferite resurse ale unei aplicații și mai mult.
RoboGuice utilizează adnotări Java, care nu sunt decât metadate încorporate în codul Java, pentru a determina ce trebuie injectat acolo. Versiunile anterioare ale RoboGuice au folosit pentru procesarea adnotărilor utilizând API-ul Java Reflection în timpul rulării și au fost deseori criticate pentru că sunt lente. RoboGuice 3, cu toate acestea, vine cu RoboBlender, un procesor de adnotare cu timp de compilare care îmbunătățește dramatic performanța RoboGuice.
Înainte de a utiliza RoboGuice, trebuie să o adăugați ca a compila
dependența de dvs. aplicaţia ale modulului build.gradle fişier. Așa cum este disponibil în depozitul implicit al Android Studio, jcenter, acest lucru necesită doar o singură linie de cod.
groovy compile 'org.roboguice: roboguice: 3.0.1'
Pentru a îmbunătăți performanța RoboGuice, este recomandat să adăugați, de asemenea, RoboBlender, un procesor de adnotări, ca prevăzut
dependenţă.
groovy furnizat 'org.roboguice: roboblender: 3.0.1'
Pentru a putea utiliza adnotările RoboGuice în activitățile Android, clasele lor trebuie să se extindă RoboActivity
in loc de Activitate
. În mod similar, dacă doriți să utilizați adnotările din interiorul unui serviciu Android, clasa sa trebuie extinsă RoboService
in loc de Serviciu
.
În mod normal, ați folosi setContentView
metoda și să treacă o resursă de aspect pentru a stabili aspectul unui Activitate
. RoboGuice oferă un mijloc alternativ de a face același lucru, @ContentView
adnotare.
De exemplu, iată cum ați aplica aspectul definit într-un fișier XML numit activity_main.xml la a RoboActivity
denumit Activitate principala:
"java @ContentView (R.layout.activity_main) clasa publică MainActivity extinde RoboActivity
“
Dacă credeți că utilizați findViewById
metoda și tipul de turnare Vedere
obiecte pe care le întoarce este o mulțime de lucru, puteți folosi RoboGuice lui @InjectView
adnotare în loc.
De exemplu, luați în considerare următorul aspect:
„xml
"
Pentru a inițializa cele două widget-uri UI definite în XML într-un RoboActivity
, ați putea scrie următoarele:
"java @InjectView (R.id.email) e-mail TextView privat;
@InjectView (R.id.okay) privat Button ok; "
Accesarea resurselor aplicației dvs. utilizând API-ul Android implică o mulțime de clase și funcții diferite. Pentru a prelua a drawable
, de exemplu, ar trebui să utilizați ContextCompat.getDrawable
. Să aducem un Animaţie
, va trebui să o utilizați AnimationUtils.loadAnimation
.
lui RoboGuice @InjectResource
adnotarea oferă o modalitate mai consecventă de a prelua toate tipurile de resurse. Următorul fragment de cod vă arată cum să injectați a ColorStateList
, A drawable
, A Şir
, si un Animaţie
resursă:
"java @InjectResource (R.color.red) privat ColorStateList roșu;
@InjectResource (R.drawable.square) privat Pătrat desenat;
@InjectResource (R.string.hello) private String salut;
@InjectResource (R.anim.fade) animație animală decolorare; "
Pentru a obține o referință la un sistem de sistem Android, cum ar fi PowerManager
sau vibrator
, puteți utiliza @Injecta
adnotare în loc să utilizeze getSystemService
metodă. De exemplu, iată cum veți primi o referință la PowerManager
:
java @ Injectați PowerManager privat pm;
Puteți utiliza funcția @InjectExtra
adnotare pentru a injecta extrasurile care au fost transmise unui a RoboActivity
. Următorul fragment de cod injectează un extra care are o cheie ADRESA DE EMAIL:
java @InjectExtra ("EMAIL_ADDRESS") e-mail privat String;
Rețineți că @InjectExtra
va provoca o eroare de executare în cazul în care extra nu este prezent. În cazul în care extra este opțional, ar trebui să includeți o facultativ
pavilion a cărui valoare este setată la Adevărat
pentru a evita eroarea.
java @ InjectExtra (valoare = "EMAIL_ADDRESS", optional = true) E-mail de caractere;
Până acum, am injectat elemente care erau specifice SDK-ului Android. Pentru a injecta propriile clase, trebuie să utilizați @Injecta
adnotare. @Injecta
se comportă mult ca Java nou
și nu trebuie să faceți nici o schimbare la o clasă pentru ao face injectabilă, cu condiția ca aceasta să aibă un constructor implicit. De exemplu, luați în considerare următoarea clasă:
java public Class Employee Angajat public () Log.d ("RG", "Hello");
Pentru a injecta o instanță a Angajat
class, ați folosi următorul cod:
java @Inject Employee p; // echivalent cu noul angajat ()
Dacă doriți mai mult control asupra a ceea ce este injectat când @Injecta
este folosit, trebuie să vă creați proprii furnizori personalizați.
Să creăm un furnizor simplu care să returneze un număr aleator de fiecare dată @Injecta
este folosit pentru a inițializa un Întreg
.
Un furnizor este doar o clasă care implementează Furnizor de
interfață. Prin urmare, creați o nouă clasă numită MyRandomNumberProvider care implementează Furnizor de
și suprascrie-i obține
metodă.
"clasa publică java MyRandomNumberProvider implementează furnizorul
@Override public Integer obține () "
După cum probabil ați ghicit, valoarea de returnare a obține
metoda este ceea ce va fi injectat când @Injecta
este folosit. Pentru a returna un întreg intamplator, adaugati urmatorul cod la obține
metodă:
java // Returnează un întreg aleator între 0 și 999 retur (int) (Math.random () * 1000);
Pentru a putea utiliza furnizorul dvs. personalizat, trebuie să creați un modul pentru acesta. Un modul este o clasă care extinde AbstractModule
clasă. În interiorul modulului, înlocuiți configurați
și să precizeze clasa pe care furnizorul ar trebui să o angajeze să o utilizeze lega
și toProvider
metode.
Pentru a crea un modul pentru MyRandomNumberProvider
, creați o nouă clasă Java numită MyRandomNumberModule și adăugați următorul cod:
"clasa publică java MyRandomNumberModule extinde AbstractModule
@Override public void configure () // Legați Integer la MyRandomNumberProvider bind (Integer.class) .toProvider (MyRandomNumberProvider.class); "
Pentru a permite companiei RoboGuice să știe despre modulul dvs., trebuie să îl înregistrați în aplicația dvs. AndroidManifest.xml folosind un meta-date
etichetă. Nume
atributul etichetei trebuie setat la roboguice.modules si este valoare
atributul ar trebui să conțină numele clasei modulului.
„xml
"
Furnizorul este acum gata. În acest moment, dacă adnotați un Întreg
cu @Injecta
, acesta va fi inițializat la un număr aleatoriu.
"java @Inject Integer random1; // Inițializată la un număr aleator
@Inject Integer random2; // inițializat la un alt număr aleatoriu "
Dacă sunteți un dezvoltator care preferă să utilizeze un singleton pentru a partaja date între mai multe activități și servicii, puteți utiliza @Singleton
și @Injecta
adnotări pentru simplificarea codului.
Prin adăugarea @Singleton
adnotarea unei clase, puteți să-i lăsați pe RoboGuice să știe că nu ar trebui să creeze mai mult de o instanță a clasei. Următorul cod creează un singur apel numit MySingleton:
java @Singleton class MySingleton
Acum puteți folosi @Injecta
adnotare pentru a injecta singleton-ul în clasele tale. De exemplu, iată cum vă injectați MySingleton
:
java @ Injectați MySingleton singleton;
Prin utilizarea funcției @Observes
adnotare, puteți observa diverse evenimente asociate cu un Activitate
. Aceasta înseamnă că nu trebuie să suprascrieți onCreate
, onResume
, și alte metode de ciclu de viață ale Activitate
clasă.
Următorul cod vă arată cum @Observes
adnotarea poate fi utilizată ca alternativă la suprimarea onCreate
și onDestroy
metode:
"java public class MainActivity extinde RoboActivity
// Chemat atunci când activitatea este creată public void initialize (@Observes OnCreateEvent e) // Codul de inițiere merge aici // Chemat atunci când Activitatea este distrusă publicul void cleanup (@Observes OnDestroyEvent e) // Curățarea codului merge aici "
În acest tutorial, ați învățat cum să utilizați RoboGuice pentru a vă face codul mai concis și lizibil. În timp ce faceți acest lucru, ați învățat de asemenea cum să utilizați adnotările Java și modelul de injecție a dependenței.
Pentru a afla mai multe despre RoboGuice, vă recomand să navigați pe wiki-ul său pe GitHub.