2014-07-16 37 views
5

ho un po 'di tempo testando alcune cose con il pugnale, dopo sovrintendere alla serie di articoli qui: http://antonioleiva.com/dependency-injection-android-dagger-part-1/, tornato per ulteriori informazioni, ho visto alcuni buoni esempi come questi: https://github.com/adennie/fb-android-dagger, la maggior parte dei che si concentra sull'iniezione di dipendenze su Activity, Fragment, Service e correlate. Sto volendo fare una cosa simile con RoboGuice.Iniettare risorse oggetto di classe Util (usando Dagger)

In RoboGuice

public class Utils { 

    @InjectResource(R.string.hello_world) private String hello; 

    public void showLog(){ 
     System.out.println("String from injected resource : " + hello); 
    } 
} 

In Dagger

public class Utils { 

    @Inject 
    Resources mResource; 

    public void showLog() { 
     System.out.println("String from injected resource : " + this.mResource.getString(R.string.hello_world)); 
    } 
} 

ho creato un modulo nella mia domanda:

@Module(injects = {Utils.class }, complete = false, library = true) 
public class ResourceModule { 

    Context mContext; 

    public ResourceModule (final Context mContext) { 
     this.mContext = mContext; 
    } 

    @Provides 
    @Singleton 
    Resources provideResources() { 
     return this.mContext.getResources(); 
    } 
} 

provato questo nella mia attività

Utils mUtils = new Utils(); 
mUtils.showLog(); 

Ma sto NullPointerException. Qualcuno ha già fatto qualcosa di simile?

risposta

2

È necessario iniettare l'oggetto utilizzando il metodo inject.

Assumendo che il ObjectGraph viene inizializzata nella classe App che è una sottoclasse del Application ed espone metodo pubblico inject con l'attuazione come di seguito:

public void inject(Object object) { 
    mObjectGraph.inject(object); 
} 

Dopo aver creato l'istanza Utils si deve iniettare le sue dipendenze.

Utils mUtils = new Utils(); 
((App) getApplication).inject(mUtils); 
mUtils.showLog(); 

Edit:

È inoltre possibile utilizzare l'iniezione costruttore (non è necessario per il passaggio dell'oggetto da ObjectGraph)

public class Utils { 

    private final Resources mResource; 

    @Inject 
    public Utils(Resources resources) { 
     mResources = resources; 
    } 

    public void showLog() { 
     System.out.println("String from injected resource : " + this.mResource.getString(R.string.hello_world)); 
    } 
} 

Con l'iniezione costruttore l'oggetto deve essere creato dal ObjectGraph

Utils mUtils = mObjectGraph.get(Utils.class); 
+0

ma cosa può altrimenti senza passare esplicitamente l'oggetto a ObjectGraph? –

+0

@ André.C.S verifica la risposta aggiornata. Ho aggiunto alcune informazioni sull'iniezione del costruttore – tomrozb

+1

Innanzitutto, grazie per aver ascoltato i miei dubbi, so che è una questione semplice, e nonostante la curva di apprendimento in questa versione sia un po 'grande, sono convinto di usarlo per l'ottimizzazione del processo in relazione a RoboGuice usando la riflessione –

Problemi correlati