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);
// ...
}
});
}