2015-08-25 54 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 –

回答