4 votes

Deux questions sur la fourniture d'une instance de HttpLoggingInterceptor pour OkHttpClient dans le module Dagger 2

Je développe un projet Android avec Kotlin et Dagger 2. J'ai un NetworkModule il est censé fournir une instance singleton de Retrofit. dans laquelle je définis toutes ces fonctions de fournisseur.

Tous les extraits de code ci-dessous sont dans NetworkModule :

@Module
object NetworkModule {
   ...
}

Ma 1ère question :

Je veux fournir un singleton de HttpLoggingInterceptor para OkHttpClient . Voici ce que j'ai essayé :

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

Mais je reçois une erreur de compilation : Unresolved reference 'setLevel' y Unresolved reference 'Level' Comment s'en débarrasser ?

Ma deuxième question :

Je définis ma fonction de fournisseur OkHttpClient comme :

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

Comment puis-je faire en sorte que seuls addInterceptor(loggingInterceptor) lorsqu'il est dans le modèle de débogage, alors qu'en mode release, il ne faut pas ajouter l'élément HttpLoggingInterceptor dans la fonction fournisseur ci-dessus ?

1voto

coroutineDispatcher Points 2535

Pour votre première question, êtes-vous sûr d'avoir les bonnes dépendances ?

Ou, puisque vous êtes en Kotlin, essayez-le comme ceci :

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

Pour votre deuxième question :

Comment puis-je faire en sorte que seul addInterceptor(loggingInterceptor) quand il est dans le modèle debug, alors qu'en mode release ne pas ajouter le HttpLoggingInterceptor dans la fonction provider ci-dessus ?

@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()
}

Remarquez le @JvmStatic y @Singleton puisque vous utilisez des singletons. L'une est pour la JVM et l'autre pour le scoping.

0voto

Yuri Schimke Points 3016

Pour configurer le logger uniquement dans les constructions DEBUG, vous avez deux possibilités

  1. Utiliser le niveau NONE basé sur Build.DEBUG

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

HttpLoggingInterceptor l = ...;

if (!BuildConfig.DEBUG) {
    l.level(HttpLoggingInterceptor.Level.NONE);
}
  1. Utiliser Dagger optional/nullable pour éviter d'activer l'intercepteur.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X