android - 使用 Dagger2 注入(inject) OkHttpClient

标签 android android-library dagger-2 aar

我希望能够使用 Dagger2 注入(inject)一个新的 OkHttpClient 但我遇到了困难。大多数教程和说明都是为应用程序编写的,我正在构建一个 aar(android 库)。

这是我的组件:

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

这是我的模块:

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

在我的库的入口点,我像这样构建组件:

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

但稍后当我尝试 @Inject OkHttpClient okHttpClient 时,它似乎始终为空。我究竟做错了什么?

最佳答案

What I'm I doing wrong?

void inject(OkHttpClient httpClient);

这将注入(inject)一个 OkHttpClient 及其所需的依赖项...但是由于您既没有调用它,也无法访问 okhttp 客户端的字段,因此此方法是多余且无用的。

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

这将构建一个组件。它将构建它。你仍然需要使用它。例如调用 inject() 并注入(inject)您要注入(inject)的对象。


您需要做的是更新您的界面,以实际将对象注入(inject)到您想要 OkHttpClient 的位置。您没有提供任何有关您希望在何处使用该客户端的信息,但您应该具有如下所示的 SomeClass,其中您已经使用上面提供的代码构建了组件:

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

然后您需要更新组件以知道您想要注入(inject)的SomeClass:

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

阅读更多关于 dagger 的教程并尝试使用它,因为您似乎并不真正了解它的工作原理或不同类的作用。 User's Guide是一个很好的起点。

关于android - 使用 Dagger2 注入(inject) OkHttpClient,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37095944/

相关文章:

java - Kotlin + Dagger 和注入(inject)构造函数?我对此迷失了

android - 无法将 Google Play 定位服务作为依赖项添加到我的 Android 项目

android - 我怎样才能让这个 View 进入我的程序? (主题链接)

android - 更新Android Studio后,没有支持库下载

android - 建库项目

java - @Inject 注解的构造函数没有定义作用域

java - 如何更改不同 fragment 中的选项菜单?

Android 通过低功耗蓝牙适配器发送数据

android - 适用于 Android 的 IRC 库(从 2.3.3 到 4.0.3)?

android - 注入(inject)改造android kotlin