我为dagger2
创建了retrofit2
模块
@Module
public class NetworkModule {
private Context context;
public NetworkModule(Application app) {
this.context = app;
}
@Singleton
@Provides
Context providesContext() {
return context;
}
@Singleton
@Provides
OkHttpClient providesOkHttpClient(Utils utils) {
User user = utils.getSettings();
return new OkHttpClient.Builder()
.connectTimeout(Long.valueOf(user.getTimeOut()), TimeUnit.SECONDS)
.writeTimeout(Long.valueOf(user.getTimeOut()), TimeUnit.SECONDS)
.readTimeout(Long.valueOf(user.getTimeOut()), TimeUnit.SECONDS)
.build();
}
@Singleton
@Provides
Retrofit providesRetrofit(OkHttpClient okHttpClient, Utils utils) {
User user = utils.getSettings();
String host = user.getHost();
if (!host.endsWith("/")) host += "/";
return new Retrofit.Builder()
.baseUrl(host)
.addConverterFactory(JacksonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.client(okHttpClient).build();
}
@Singleton
@Provides
RestApiFactory providesRestApiFactory(Retrofit retrofit) {
return new RestApiFactory(retrofit);
}
}
我有设置活动,用户可以在其中更改baseUrl,timeOut。如果我创造
providesRetrofit
providesRestApiFactory
providesOkHttpClient
像@Singleton
- 更改设置后它不会改变。如果我删除@Singleton
注释 - 所有工作。我的问题 - 当用户更改数据时,如何更新dagger @Singleton
?
将NetworkModule放在单独的组件(可能是主组件的子组件)中,并在用户更改baseUrl,timeout等时重新创建它。
您可以通过创建使用@Subcomponent
注释的界面并在其中添加网络模块来实现。您可以通过从主要组件调用您还需要添加的方法来实例化此子组件。
详细教程