4

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

下面的所有代码片段都在里面NetworkModule

@Module
object NetworkModule {
   ...
}

我的第一个问题:

我想提供一个HttpLoggingInterceptorfor的单例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在上面的提供程序函数中添加?

4

2 回答 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注释,因为您使用的是单例。一个用于 JVM,另一个用于范围。

于 2019-12-26T10:00:03.167 回答
0

对于仅在 DEBUG 构建中设置记录器,您有两个选项

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

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

HttpLoggingInterceptor l = ...;

if (!BuildConfig.DEBUG) {
    l.level(HttpLoggingInterceptor.Level.NONE);
}
  1. 使用 Dagger optional/nullable 避免设置拦截器

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

于 2019-12-26T08:01:51.803 回答