2017-07-26 7 views
0

私の場合、私はダイナミックにURLを変更する必要がありますが、レトロフィットクライアントのインスタンスを2つ作成したくありません。私は、インターセプタの変更を介してベースURLを変更しようとしていますが、retrofit stilは古い値を使用しています。私は間違って何をしていますか?ダガー2とレトロフィット2がベースURLを変更

App.java

public class App extends Application { 
    private static AppComponent appComponent; 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     appComponent = 
       DaggerAppComponent 
         .builder() 
         .appModule(new AppModule(this)) 
         .build(); 

    } 

    @NonNull 
    public static App get(@NonNull Context context) { 
     return (App) context.getApplicationContext(); 
    } 

    public static AppComponent getAppComponent() { 
     return appComponent; 
    } 
} 

AppModule.java

@Module 
public class AppModule { 
    private Context context; 

    public AppModule(Context context) { 
     this.context = context; 
    } 

    @Provides 
    @Singleton 
    Context provideContext() { 
     return context; 
    } 

} 

NetModule.java

@Module 
public class NetModule { 

    @Provides 
    @Singleton 
    Gson provideGson() { 
     GsonBuilder gsonBuilder = new GsonBuilder(); 
     gsonBuilder.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES); 
     return gsonBuilder.create(); 
    } 
    @Provides 
    @Singleton 
    MainInterceptor provideMyApiInterceptor() { 
     return MainInterceptor.get(); 
    } 

    @Provides 
    @Singleton 
    OkHttpClient provideOkhttpClient() { 
     OkHttpClient.Builder client = new OkHttpClient.Builder(); 
     client.readTimeout(15, TimeUnit.SECONDS); 
     client.connectTimeout(20, TimeUnit.SECONDS); 
     return client.build(); 
    } 

    @Provides 
    @Singleton 
    Retrofit provideRetrofit(Gson gson, OkHttpClient okHttpClient) { 
     return new Retrofit.Builder() 
       .addConverterFactory(GsonConverterFactory.create(gson)) 
       .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) 
       .baseUrl("first.url.com") 
       .client(okHttpClient) 
       .build(); 
    } 
} 

NetComponent.java

@Singleton 
@Component(modules = NetModule.class) 
public interface NetComponent { 
    Retrofit getRetrofit(); 

    MainInterceptor getInterceptor(); 
} 

MainInterceptor.class

public class MainInterceptor implements Interceptor { 
    private static MainInterceptor sInterceptor; 
    private String mScheme; 
    private String mHost; 

    public static MainInterceptor get() { 
     if (sInterceptor == null) { 
      sInterceptor = new MainInterceptor(); 
     } 
     return sInterceptor; 
} 

    private MainInterceptor() { 
    } 

    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 (mScheme != null && mHost != null) { 
      HttpUrl newUrl = original.url().newBuilder() 
        .scheme(mScheme) 
        .host(mHost) 
        .build(); 
      original = original.newBuilder() 
        .url(newUrl) 
        .build(); 
     } 
     return chain.proceed(original); 
    } 
} 

そして、これは、いくつかのクラスのコンポーネントを初期化するためのコードです。その後

NetComponent component= DaggerNetComponent.create(); 
DataService service = component.getRetrofit().create(DataService.class); 
MainInterceptor interceptor = component.getInterceptor(); 
interceptor.setInterceptor("second.url.com"); 
service.getSomeData() 

は、URLがまだある "first.url.com"

+0

[Dagger + Retrofit動的URL](https://stackoverflow.com/questions/36769923/dagger-retrofit-dynamic-url) –

+0

またはこの1つの可能な複製:https://stackoverflow.com/q/36498131/1837367 –

答えて

1

あなたがRetrofitを提供する場合、あなたはすでにbaseUrlに "first.url.com"

return new Retrofit.Builder() 
      .addConverterFactory(GsonConverterFactory.create(gson)) 
      .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) 
      .baseUrl("first.url.com") 
      .client(okHttpClient) //<------ It not OkHttp with your MainInterCeptor 
      .build(); 

を設定し、 RetrofitOkHttp

で構築されたので、楽しい事実は、セット・アップされて新しいURLをご MainInterceptorは、あなたの Retrofitには無関係です

BASE_URLを動的に変更するには、さまざまな方法があります。

public class ApiConstant { 

    public static String BASE_URL = "yourUrl"; 

    private ApiConstant() { 
    } 
} 

それは改修

@Provides 
@PerActivity 
Retrofit provideRetrofit(Gson gson, OkHttpClient okHttpClient) { 
    return new Retrofit.Builder() 
      .addConverterFactory(GsonConverterFactory.create(gson)) 
      .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) 
      .baseUrl("first.url.com") 
      .client(ApiConstant.BASE_URL) 
      .build(); 
} 

を構築するときに次にDaggerActivityComponentを初期化するときBASE_URLを変更し、それを使用し

@Scope 
@Retention(RetentionPolicy.RUNTIME) 
public @interface PerActivity { 
} 

を変更することができますので、レトロフィット用@Scopeを作成します。 (または、新しいURLのための新しい@Scopeを作成する)

読むthis documentationは詳細について

・ホープこのヘルプは!

+0

ただ簡単な質問ですが、provideRetrofitはSingleton以来、一度だけ実行されます。 URLはどのように変わるのですか? (私が変えたと仮定して、ApiConstant.BASE_URL? – Tander

+0

私に気づいてくれてありがとう。その文字列を変更したり、2番目の方法を使用したりすることができます –

+0

文字列を変更することができます。しかし、Retrofitのインスタンスはまだ古いURLを指していますが、そうではありませんか? – Tander

関連する問題