2014-07-16 17 views
5

Ich einige Zeit einige Dinge mit Dagger testen, nach der Überwachung der Reihe von Artikeln hier: http://antonioleiva.com/dependency-injection-android-dagger-part-1/, ging zurück für weitere Informationen, sah ich einige gute Beispiele wie diese: https://github.com/adennie/fb-android-dagger, die meisten von die sich auf das Injizieren von Abhängigkeiten auf Activity, Fragment, Service und verwandte konzentriert. Ich möchte eine ähnliche Sache mit RoboGuice machen.Inject Objekt Ressourcen in Class Util (mit Dolch)

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

Ich habe ein Modul in meiner Anwendung:

@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(); 
    } 
} 

versucht, dies in meiner Aktivität

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

Aber ich bin immer NullPointerException. Hat jemand schon etwas Ähnliches gemacht?

Antwort

2

Sie müssen das Objekt mit der Methode inject injizieren.

Vorausgesetzt, dass Ihr ObjectGraph in der App Klasse initialisiert, die eine Unterklasse der Application ist und macht öffentlich inject Verfahren bei der Umsetzung wie folgt:

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

Nach dem Erstellen der Utils Instanz, die Sie seine Abhängigkeiten injizieren müssen.

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

Edit:

Sie auch Konstruktor Injektion (keine Notwendigkeit für das Bestehen der Objekt 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)); 
    } 
} 

Mit Konstruktor Injektion das Objekt erstellt werden muss, durch die ObjectGraph

verwenden können
Utils mUtils = mObjectGraph.get(Utils.class); 
+0

aber was kann man sonst ohne das ObjectGraph explizit übergeben? –

+0

@ André.C.S überprüfen Sie die aktualisierte Antwort. Ich habe ein paar Informationen über Konstruktor Injektion hinzugefügt – tomrozb

+1

Erstens, danke für meine Zweifel zu hören, ich weiß, das ist eine einfache Sache, und trotz der Lernkurve in dieser Lib ein wenig groß, ich bin überzeugt, es für die Prozessoptimierung zu verwenden in Bezug auf RoboGuice mit Reflektion –