【发布时间】:2017-08-21 14:14:23
【问题描述】:
我正在尝试动态更改 android 应用程序的 baseUrl,但 url 没有更改。
我从这里参考了 David 的答案,OkHttp 方法 Dagger + Retrofit dynamic URL 和 Set dynamic base url using Retrofit 2.0 and Dagger 2,但仍然没有运气。
最初,应用程序指向网址“https://imd.com/yeddydemo/wpApp/”,这是我们的应用程序基本网址。
在做了一些谷歌搜索后,我编写了以下代码来将应用程序基本 url 指向https://imd.com/rahudemo/wpApp/,但它不能正常工作:
谁能指出我做错的地方。在此先感谢:)
修改基础url的方法:
public void changeUrlConfiguration(String name){
NetComponent netComponent = DaggerNetComponent.builder()
.apiModule(new ApiModule("https://imd.com/rahudemo/wpApp/"))
.appModule(new AppModule((ImdPoApp)homeActivity.getApplication()))
.storageModule(new StorageModule((ImdPoApp)homeActivity.getApplication()))
.build();
ApiStories service = netComponent.retrofit().create(ApiStories.class);
HostSelectionInterceptor interceptor = netComponent.interceptor();
interceptor.setHost("https://imd.com/rahudemo/wpApp/","8WAtp8nUEOrzSu67t9tGITEo");
}
拦截器类
public final class HostSelectionInterceptor implements Interceptor {
private volatile String host;
private String authKey;
public void setHost(String host,String authKey) {
this.host = host;
this.authKey=authKey;
new ApiModule(host);
}
@Override public okhttp3.Response intercept(Chain chain) throws IOException {
Request request = chain.request();
String host = this.host;
if (host != null) {
HttpUrl newUrl = HttpUrl.parse(host);
request = request.newBuilder()
.url(newUrl)
.build();
}
return chain.proceed(request);
}
}
ApiModule
@Module
public class ApiModule {
String mBaseUrl;
HostSelectionInterceptor sInterceptor;
public ApiModule(String mBaseUrl) {
this.mBaseUrl = mBaseUrl;
}
@Provides
@Singleton
Cache provideHttpCache(Application application) {/*..*/}
@Provides
@Singleton
Gson provideGson() {/*..*/}
@Provides
@Singleton
OkHttpClient provideOkhttpClient(Cache cache, HostSelectionInterceptor hostSelectionInterceptor) {
OkHttpClient.Builder client = new OkHttpClient.Builder();
client.addInterceptor(chain -> {
Request request = chain.request();
Request.Builder builder = request.newBuilder().addHeader("Authkey", "8WAtp8nUEOrzSu67t9tGITEo");
return chain.proceed(builder.build());
});
client.addInterceptor(hostSelectionInterceptor);
client.cache(cache);
return client.build();
}
@Provides
@Singleton
HostSelectionInterceptor provideInterceptor() {
if (sInterceptor == null) {
sInterceptor = new HostSelectionInterceptor();
}
return sInterceptor;
}
@Provides
@Singleton
Retrofit provideRetrofit(OkHttpClient okHttpClient) {
return new Retrofit.Builder()
.addConverterFactory(GsonConverterFactory.create())
.baseUrl(mBaseUrl)
.client(okHttpClient)
.build();
}
}
【问题讨论】:
-
您正在方法中创建一个新的
NetComponent。当组件范围结束时(即方法结束时),对该组件中的任何object所做的所有更改都将丢失
标签: android dependency-injection retrofit2 interceptor dagger-2