如何使用Dagger2提供上下文

Rum*_*mid 2 android rx-java okhttp dagger-2 retrofit2

我正在学习Android,并且正在遵循有关RxJava和Dagger2的Retrofit2的一些指南。现在,我不想处理没有互联网连接的情况。我已经找到了这个答案,这似乎很不错,但是我不知道如何应用。

我有一些NetworkModule,与OkHttpClient提供商。我假设我需要OkHttpClient.Builder使用拦截器进行创建。所以它应该看起来像这样:

@Provides
@Singleton
OkHttpClient provideOkHttpClient(Cache cache) {
    ConnectivityInterceptor ci = new ConnectivityInterceptor(networkObservable()));
    OkHttpClient.Builder.addInterceptor(ci)
    return builder.build();
}

private boolean networkObservable() {
    ConnectivityManager cm =
            (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);

    NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
    return activeNetwork != null && activeNetwork.isConnectedOrConnecting();
}
Run Code Online (Sandbox Code Playgroud)

这是我所没有的Context。我应该朝哪个方向-尝试在那里获取上下文,或者可能我误解了可观察对象的概念?

Ant*_*kov 5

您可以@Provides在DaggerModule中使用注释来获取应用程序上下文。或者,您可以创建一个模块,该模块在其构造函数中接受Context参数,以防您需要活动上下文。然后,您可以在活动中构建组件并将参数注入其中。

 @Module
public class AppModule {

    private Context context;

    public AppModule(@NonNull Context context) {
        this.context = context;
    }

    @Singleton
    @Provides
    @NonNull
    public Context provideContext(){
        return context;
    }

}
Run Code Online (Sandbox Code Playgroud)

应用类别:

public class PFApplication extends Application {

    private static AppComponent appComponent;

    public static AppComponent getAppComponent() {
        return appComponent;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        appComponent = buildComponent();
    }

    public AppComponent buildComponent(){
        return DaggerAppComponent.builder()
                .appModule(new AppModule(this))
                .build();
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 对于对话,我需要活动上下文。 (2认同)