2015-08-25 51 views
0

我一直在想什么是解决令牌刷新问题的最佳方法。 我连接到一个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命令。

任何建议将不胜感激。

+0

你有没有发现任何其他的解决办法? @alexk –

回答