我一直在想什么是解决令牌刷新问题的最佳方法。 我连接到一个API,它为我提供了一个auth-token,如果在调用期间有一段时间,我得到一个INVALID_AUTH,我需要重新进行身份验证。 所以对于幼稚的做法我这样做使用RxJava管理身份验证令牌
@SuppressWarnings("unchecked")
@Override
public Observable<User> getUsers() {
return runCommandAndrefreshAuthIfNecessary(new RequestCommand() {
@Override
public Observable create() {
return createService(UsersApi.class).getUsers();
}
});
}
private Observable runCommandAndrefreshAuthIfNecessary(final RequestCommand command) {
return command.create()
.onErrorResumeNext(new Func1<Throwable, Observable<?>>() {
@Override
public Observable<?> call(Throwable throwable) {
return handleRefreshToken(command);
}
});
}
private Observable<?> handleRefreshToken(final RequestCommand command) {
return refreshToken().flatMap(new Func1<Boolean, Observable<?>>() {
@Override
public Observable<?> call(Boolean aBoolean) {
return command.create();
}
});
}
正如你可以看到我只是包装改造命令,如果我得到一个错误,我运行refreshToken(),令牌刷新而我再次运行该命令改造,所以最终Observable被传回给用户。按预期工作。 我正在努力的事情是什么发生我多次调用,例如,我打电话getUsers和getFlags一个接一个。他们两个都得到了INVALID_AUTH,现在都是fire refreshToken(),这是不好的。 我正在寻找一种rx-java方式来管理调用,意思是在getUsers第一次调用之后触发refreshToken,之后的任何调用都需要等待refreshToken结束,然后才会触发retrofit命令。
任何建议将不胜感激。
你有没有发现任何其他的解决办法? @alexk –