Dependența de injecție pe Android cu RoboGuice

Introducere

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.

1. Înțelegerea dependenței de injecție

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

2. Cum funcționează RoboGuice

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.

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

4. Asocierea planurilor cu activitățile

Î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

5. Injectarea viziunilor

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

6. Resursele de injectare

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

7. Servicii de sistem de injectare

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;

8. Injecție suplimentară

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;

9. Injectați propriile dvs. clase

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

10. Utilizarea furnizorilor personalizați

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.

Pasul 1: Creați un furnizor

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

Pasul 2: Creați un modul

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

Pasul 3: Înregistrați modulul

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 "

11. Lucrul cu Singletons

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;

12. Observarea evenimentelor

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  "

Concluzie

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

Cod