2017-10-16 38 views
0

Je crée un nouveau projet MVP, et utilise Dagger 2 avec Retrofit, mais je suis confronté à ce problème où l'application est censée obtenir l'URL de base du serveur et commencer à appeler les API réseau .Dagger 2 Mettre à jour l'URL de base dans Retrofit

Le problème ici est que je ne pouvais pas mettre à jour l'URL lors de l'exécution! La meilleure solution que j'ai trouvé était de mettre à jour l'URL, mais au prochain lancement de l'application!

J'ai essayé beaucoup d'idées et de solutions qui existaient sur StackOverFlow mais aucune n'a fonctionné!

private final Application mApplication; 
private String mBaseUrl; 


public ApplicationModule(Application application, String baseUrl) { 
    mApplication = application; 
    mBaseUrl = baseUrl; 
} 


@Provides 
@Singleton 
OkHttpClient providesOkHttpClient() { 
    OkHttpClient.Builder client = new OkHttpClient.Builder(); 

    client.readTimeout(Constants.TIMEOUT, TimeUnit.SECONDS); 
    client.connectTimeout(Constants.TIMEOUT, TimeUnit.SECONDS); 

    return client.build(); 
} 


@Provides 
@RetrofitGSON 
Retrofit providesRetrofit(OkHttpClient okHttpClient) { 
    return new Retrofit.Builder() 
      .baseUrl(mBaseUrl) 
      .addConverterFactory(ScalarsConverterFactory.create()) 
      .addConverterFactory(GsonConverterFactory.create(new GsonBuilder() 
          .setPrettyPrinting() 
          .create() 
        ) 
      ) 
      .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) 
      .client(okHttpClient) 
      .build(); 
} 

Toute aide serait vraiment appréciée!

Répondre

0

Pour tous ceux qui ont ce genre de problème, voici comment le résoudre. vous devez remplacer okhttp Interceptor.

@Singleton 
public class ExampleInterceptor implements Interceptor { 
    private static ExampleInterceptor sInterceptor; 
    private String mScheme; 
    private String mHost; 

    @Inject 
    public static ExampleInterceptor get() { 
     if (sInterceptor == null) { 
      sInterceptor = new ExampleInterceptor(); 
     } 
     return sInterceptor; 
    } 

    private ExampleInterceptor() { 
     // Intentionally blank 
    } 

    public void setInterceptor(String url) { 
     HttpUrl httpUrl = HttpUrl.parse(url); 
     mScheme = httpUrl.scheme(); 
     mHost = httpUrl.host(); 
    } 

    @Override 
    public Response intercept(Chain chain) throws IOException { 
     Request original = chain.request(); 

     // If new Base URL is properly formatted than replace with old one 
     if (mScheme != null && mHost != null) { 
      HttpUrl newUrl = original.url().newBuilder() 
       .scheme(mScheme) 
       .host(mHost) 
       .build(); 
     original = original.newBuilder() 
       .url(newUrl) 
       .build(); 
     } 
    return chain.proceed(original); 
    } 
}