Dagger 2 OkHttpClient Authenticator с AccountManagerFuture

Я пишу приложение для Android с Dagger 2, Retrofit и я хочу использовать AccountManager коммунальные услуги.

Мне нужно предоставить OkHttpClient с конкретным Authenticator которые обновляют токен, используя AccountManagerFuture звонки. Код очень похож на этот:

@Provides
@Singleton
OkHttpClient provideOkHttpClient() {
    return new OkHttpClient.Builder()
        .authenticator(new Authenticator() {
            @Override
            public Request authenticate(Route route, Response response) throws IOException {
                // TODO: Refresh the authToken using the AccountManagerFuture call.

                // ...
            }
    });
}

Вопрос

@Provides аннотация допускает только синхронные зависимости, но я знаю, что @Produces управляет также асинхронными. Могу ли я использовать @Produces предоставлять AccountManagerFuture звонки (напр. #addAccount или же #getAuthToken)?

Мое предложение

Я немного запутался по этому поводу, но я бы дал вам свое предложение. Я не пытался, но, кажется, делает то же самое два раза...

@Produces
AccountManagerFuture<Bundle> produceRefreshAuthToken(AccountManager accountManager) {
    return accountManager.getAuthToken(accountType, authTokenType, null, activity, new AccountManagerCallback<Bundle>() {
            @Override
            public void run(AccountManagerFuture<Bundle> accountManagerFuture) {
                try {
                    // Get the future result.
                    Bundle future = accountManagerFuture.getResult();
                    // Get the authToken.
                    String authtoken = future.getString(AccountManager.KEY_AUTHTOKEN);


                } catch (OperationCanceledException | AuthenticatorException | SecurityException | IOException ex) {

                }
            }
        }, null);

}

@Provides
@Singleton
OkHttpClient provideOkHttpClient(AccountManagerFuture<Bundle> future) {
    return new OkHttpClient.Builder()
        .authenticator(new Authenticator() {
            @Override
            public Request authenticate(Route route, Response response) throws IOException {
                 // Get the result.
                 Bundle bundle = future.getResult();
                 // Get the auth-token.
                 String authToken = bundle.getString(AccountManager.KEY_AUTHTOKEN);

                // ...
            }
    });
}

0 ответов

Другие вопросы по тегам