使用动态数据匕首 [英] Dagger using dynamic data

查看:178
本文介绍了使用动态数据匕首的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有DI在我的项目。其中一个模块是的AppModule ,他将提供 RestClient

I have DI in my project. One of modules is AppModule and he is providing 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;
}

在登录片段输入我的用户名和密码,它们保存到共享preferences 一切似乎是不错的。授权的作品。

On the login fragment I enter my username and password, they saves into SharedPreferences all seems be good. Authorization works.

但是,如果我输入错误的凭据,它们保存到共享preferences,但是,当我重​​新输入有效凭据我的 RestClient 犯规更新,因为的AppModule 实例只有一次应用程序启动时。我怎样才能重新创建的AppModule 来使用新的共享preferences?

But if i enter wrong credentials, they saves into shared preferences, but when i'm re-enter valid credentials my RestClient doesnt updating, because AppModule instantiate only once when the application starts. How can i re-create AppModule to use new shared preferences?

推荐答案

现在的问题是,你正在创建的 userAndPassword 字符串当您创建的适配器。

The problem is that you are creating the userAndPassword string when you create the adapter.

@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;
}

然后创建一个请求时,和拦截器被调用时,它会检查preferences和拉它需要的值。

Then each time a request is created, and the interceptor is called, it will check preferences and pull in the values it needs.

这篇关于使用动态数据匕首的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆