我的项目中有DI。其中一个模块是AppModule
,他正在提供RestClient
@WithoutAuth
@Provides
@Singleton
RestAdapter provideRestAdapter(final RemontnikPreferences preferences) {
final String userAndPassword = preferences.getUsername() + ":" + preferences.getPassword();
RequestInterceptor requestInterceptor = new RequestInterceptor() {
@Override
public void intercept(RequestFacade request) {
request.addHeader("Authorization", "Basic " + Base64.encodeToString(userAndPassword.getBytes(), Base64.NO_WRAP));
}
};
RestAdapter restAdapter = new RestAdapter.Builder()
.setEndpoint("https://")
.setRequestInterceptor(
.build();
preferences.setPassword("");
return restAdapter;
}
在登录片段上,我输入我的用户名和密码,它们保存到SharedPreferences
似乎都很好。授权有效。
但是如果我输入了错误的凭据,他们会保存到共享首选项中,但是当我重新输入有效凭据时,RestClient
不会更新,因为AppModule
仅在应用程序启动时实例化一次。如何重新创建AppModule
以使用新的共享偏好设置?
答案 0 :(得分:0)
问题是您在创建适配器时正在创建userAndPassword
字符串。
@WithoutAuth
@Provides
@Singleton
RestAdapter provideRestAdapter(final RemontnikPreferences preferences) {
RequestInterceptor requestInterceptor = new RequestInterceptor() {
@Override
public void intercept(RequestFacade request) {
String userAndPassword = preferences.getUsername() + ":" + preferences.getPassword();
request.addHeader("Authorization", "Basic " + Base64.encodeToString(userAndPassword.getBytes(), Base64.NO_WRAP));
}
};
RestAdapter restAdapter = new RestAdapter.Builder()
.setEndpoint("https://")
.setRequestInterceptor(requestInterceptor)
.build();
preferences.setPassword("");
return restAdapter;
}
然后,每次创建请求并调用拦截器时,它都会检查首选项并提取所需的值。