2016-05-08 12 views
1

Ich möchte in der Lage sein, ein neues OkHttpClient mit Dagger2 zu injizieren, aber eine harte Zeit habe. Die meisten Tutorials und Anleitungen sind für Anwendungen geschrieben und ich baue eine AAR (Android-Bibliothek).Injecting OkHttpClient mit Dagger2

hier ist meine Komponente:

@Singleton 
@Component(modules = {NetworkModule.class}) 
public interface AndroidSdkComponent { 
    void inject(OkHttpClient httpClient); 
} 

hier ist mein Modul:

DaggerAndroidSdkComponent.builder().networkModule(new NetworkModule()) 
              .build(); 

aber später, wenn:

@Module 
public class NetworkModule { 

    @Provides 
    @Singleton 
    OkHttpClient provideOkHttpClient(Context context) { 
     final OkHttpClient client = new OkHttpClient(); 
     if (Configuration.isAlphaBuild(context)) { 
      client.networkInterceptors().add(new StethoInterceptor()); 
     } 
     return client; 
    } 
} 

Bei einem Einstiegspunkt meiner Bibliothek ich die Komponente wie so bauen Ich versuche @Inject OkHttpClient okHttpClient es scheint immer Null zu sein. Was mache ich falsch?

Antwort

2

Was ich mir falsch?

void inject(OkHttpClient httpClient); 

Dies wird eine OkHttpClient mit den Abhängigkeiten injizieren es braucht ... Aber da du es weder nennen, noch auf die Felder des okhttp Client-Zugriff haben sowieso diese Methode ist überflüssig und nutzlos.

DaggerAndroidSdkComponent.builder().networkModule(new NetworkModule()) 
             .build(); 

Dies wird eine Komponente bauen. Es wird bauen es. Sie müssen es immer noch verwenden. z.B. Rufen Sie inject() und injizieren Sie das Objekt, das Sie injizieren möchten.


Was Sie tun müssen, ist Ihre Schnittstelle zu aktualisieren, um tatsächlich das Objekt zu injizieren, wo Sie die OkHttpClientin wollen. Sie geben keine Informationen, wo Sie wollen, dass der Client verwendet werden, aber Sie sollten SomeClass wie die folgenden haben, wo Sie bereits die Komponente mit dem Code bauen Sie oben gesetzt:

class SomeClass { 
    @Inject 
    OkHttpClient mClient(); // THIS is how you mark a field for injection 

    void someMethod() { 
     AndroidSdkComponent component = DaggerAndroidSdkComponent.builder().networkModule(new NetworkModule()) 
       .build(); 

     component.inject(this); // THIS is how you inject a field (okhttp!) 
    } 
} 

Dann müssen Sie aktualisiert die Komponente wissen über SomeClass dass Sie injiziert werden soll:

@Singleton 
@Component(modules = {NetworkModule.class}) 
public interface AndroidSdkComponent { 
    void inject(SomeClass someclass); // THIS will inject okhttp to your someclass object, as seen above 
} 

Bitte einige weitere Tutorials lesen über Dolch und versuche, damit zu spielen, da es scheint, dass du nicht wirklich verstehst, wie es funktioniert oder was die verschiedenen Klassen machen. Die User's Guide ist ein guter Anfang.