我正在用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
?
对于您的第一个问题,您确定您具有正确的依赖性吗?
或者因为您在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,另一个用于范围。
仅在调试版本中设置记录器,您有两个选择
https://stackoverflow.com/a/23844716/1542667
HttpLoggingInterceptor l = ...;
if (!BuildConfig.DEBUG) {
l.level(HttpLoggingInterceptor.Level.NONE);
}