匕首使用动态数据

时间:2014-12-08 10:35:08

标签: android dagger

我的项目中有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以使用新的共享偏好设置?

1 个答案:

答案 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;
}

然后,每次创建请求并调用拦截器时,它都会检查首选项并提取所需的值。