2014-06-12 11 views
60

Quindi mi sono imbattuto in queste best practice sugli articoli Android sulle prestazioni della memoria.L'opzione "Evita i framework di dipendenza delle dipendenze" nella Guida alla memoria di Android si applica anche a Dagger?

http://developer.android.com/training/articles/memory.html

Dissero

evitare la dipendenza quadri iniezione

Uso di un quadro di iniezione di dipendenza, come Guice o RoboGuice possono essere attraente perché possono semplificare il codice che si scrive e fornire un ambiente adattivo che è utile per test e altre modifiche alla configurazione di . Tuttavia, questi framework tendono ad eseguire molto dell'inizializzazione del processo eseguendo la scansione del codice per le annotazioni, che può richiedere una quantità significativa del codice da mappare nella RAM anche se non è necessario. Queste pagine mappate sono allocate nella memoria pulita in modo che Android possa rilasciarle, ma ciò non accadrà finché le pagine non sono state lasciate in memoria per un lungo periodo di tempo.

Ma che dire di Dagger che pretendono di essere veloci. Non sei sicuro di quale scegliere?

+27

Perché questa domanda hanno -6 voti ed è contrassegnato in primo luogo come opinione a base ?? L'autore è semplice chiedendo se il framework di Dagger si adatta al contesto descritto nel testo fornito dalla guida per sviluppatori Android, che è una domanda leggibile (non basata su opinioni) –

risposta

37

Questa raccomandazione fa non si applica ugualmente a tutti i quadri di iniezione delle dipendenze.

..frameworks [che funzionano come Guice] tendono a eseguire un sacco di inizializzazione del processo con la scansione del codice per le annotazioni, che può richiedere una notevole quantità del codice per essere mappati in RAM anche se si non ne hanno bisogno ..

quindi, se si utilizza un quadro dI/CIO che non scansione per detti [run-time] annotazioni, che implica il [eccessiva] uso di riflessione, allora questo motivo non si applica Mentre Dagger utilizza annotazioni, queste sono used differently rispetto a Guice ed evitano il problema indicato.

Dal Dagger è stato scritto come "Un veloce dipendenza Injector per Android e Java", gli autori hanno progettato per questo scopo e credere che sia adatto a tale obiettivo - andare avanti, fare un tentativo .


Dagger utilizza fase di compilazione annotazioni (bene, mostly) invece di basarsi su annotazioni run-time e di riflessione; è la scansione e il riflesso dell'annotazione di runtime che causa il problema di cui la guida della memoria era a conoscenza.

+4

Ho creato un [problema per i documenti android] (https://code.google.com/p/android/issues/detail?id=213009&thanks=213009&ts=1465906273). si prega di votare per questo problema. – TmTron

+1

Lo stuzzicadenti è anche una buona alternativa a Dagger, con le stesse prestazioni e memory foot print: https://github.com/stephanenicolas/toothpick – Snicolas

0

Il creatore di Dagger, @JakeWharton, ha anche scritto una vista quadro più semplice "iniezione" chiamato Butterknife

because all the RoboGuice converts were complaining about lack of "view injection" with Dagger.

si utilizza in questo modo:

class ExampleActivity extends Activity { 
    @InjectView(R.id.title) TextView title; 
    @InjectView(R.id.subtitle) TextView subtitle; 
    @InjectView(R.id.footer) TextView footer; 

    @Override public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.simple_activity); 
    ButterKnife.inject(this); 
    // TODO Use "injected" views... 
    } 
} 
12

Il team di Android ha recentemente aggiornato la loro raccomandazione di suggest developers use Dagger 2.

La precedente raccomandazione era basata sull'elevato costo della riflessione. Dal momento che Dagger 2 non utilizza più la riflessione - ha fatto Dagger 1 - lo credono "può essere utilizzato nelle app Android senza costi di runtime o utilizzo della memoria inutili".

(Disclaimer:. Sono il team manager Pugnale 2)

+0

Questa è una bella risposta per la domanda –

Problemi correlati