关于在Dagger 2模块中为OkHttpClient提供HttpLoggingInterceptor实例的两个问题

问题描述 投票:4回答:2

我正在用Kotlin和Dagger 2开发一个Android项目。我有一个NetworkModule,它应该提供Retrofit的单例实例。在其中定义所有这些提供程序功能。

下面的所有代码段都在NetworkModule中:

@Module
object NetworkModule {
   ...
}

我的第一个问题:

我想为HttpLoggingInterceptor提供一个OkHttpClient的单例。这是我尝试过的:

@Provides
internal fun provideLoggingInterceptor(): Interceptor {
    // compiler error: Unresolved reference 'setLevel', unresolved reference 'Level'
    return HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY)
}

但是出现编译错误:Unresolved reference 'setLevel'Unresolved reference 'Level',如何清除它?

我的第二个问题:

我将我的OkHttpClient提供程序函数定义为:

@Provides
internal fun provideOkHttpClient(loggingInterceptor: Interceptor): OkHttpClient {
        return OkHttpClient.Builder()
                        .addInterceptor(loggingInterceptor)
                        ...
                        .build()
}

如何使它只有在调试模型中时才addInterceptor(loggingInterceptor),而在发布模式中不要在上述提供程序函数中添加HttpLoggingInterceptor

android retrofit2 dagger-2 okhttp retrofit2.6
2个回答
1
投票

对于您的第一个问题,您确定您具有正确的依赖性吗?

或者因为您在Kotlin,请像这样尝试:

@JvmStatic
@Provides
@Singleton
fun provideLoggingInterceptor(): HttpLoggingInterceptor {
    val httpLoggingInterceptor = HttpLoggingInterceptor()
    httpLoggingInterceptor.level = HttpLoggingInterceptor.Level.BODY
    return httpLoggingInterceptor
}

关于您的第二个问题:

我该如何做,以便仅当addInterceptor(loggingInterceptor)它在调试模型中,而在发布模式中则不添加上面提供者函数中的HttpLoggingInterceptor?

@Provides
@JvmStatic
@Singleton
fun provideOkHttpClient(interceptor: Interceptor): OkHttpClient{
 val okhttpBuilder = OkHttpClient.Builder() //and every other method after it except build() would return a Builder (Builder pattern)
 if(BuildConfig.DEBUG){
  okHttpBuilder.addInterceptor(interceptor)
 }
 return okHttpBuilder.build()
}

请注意@JvmStatic@Singleton注释,因为您使用的是Singletons。一个用于JVM,另一个用于范围。


0
投票

仅在调试版本中设置记录器,您有两个选择

  1. 使用基于Build.DEBUG的NONE级别

https://stackoverflow.com/a/23844716/1542667

HttpLoggingInterceptor l = ...;

if (!BuildConfig.DEBUG) {
    l.level(HttpLoggingInterceptor.Level.NONE);
}
  1. 使用Dagger可选/可为空,以避免设置拦截器

https://medium.com/@birajdpatel/avoid-nullable-dependencies-in-dagger2-with-bindsoptionalof-c3ad8a8fde2c

© www.soinside.com 2019 - 2024. All rights reserved.