2016-03-22 16 views
2

トークンリフレッシュシステムを実装したAPIに直面しています。 APIリクエストにRetrofitを使用しています。Error 401が指定されたときに検出し、トークンをリフレッシュするための新しいリクエストをするためにAuthenticatorを設定しました。複数の非同期api呼び出しを使用するオーセンティケータ

複数のリクエストが同時にある場合(たとえば、ViewPagerの複数のページを記入する場合や、ユーザーがアプリを使用中に別のAPIリクエストが発生した場合のServiceのAPIリクエストの場合)エラーが複数回発生しているため、アプリケーションがオーセンティケータを複数回要求しています。

これをどのように修正できますか?私はアプリケーションがトークンリフレッシュコールを行っているかどうかを検出するためにbooleanSingletonを考えていますが、それを達成するための最良の方法とは思われません...どのようなrecomendations?

+0

はイアン湖からこの記事に私がチェックします https://medium.com/google-developers/making-loading-data-on-android-lifecycle-aware-897e12760832#.llikp8avi – marco

+0

を見てみましょうそれ、ありがとう! – antonicg

+0

OAuthを使用していますか?どのくらいの頻度でアクセストークンを更新する必要がありますか?それほど頻繁ではない場合は、現在のユーザーが有効なトークンを持っている場合は、「テスト」エンドポイントにアクセスしようとすることで、アプリケーションの開始をチェックできます。 200を受信して​​コンテンツ画面やその他の要求を処理する場合は、新しいアクセストークンを取得しようとしない場合、まだ有効でない場合は、新しい更新トークン - >ログイン画面を表示する必要があります。 – rafakob

答えて

0

私はSingletonが良いアイデアだと言いますが、Singletonによって、私はAPIクライアントオブジェクト内に資格情報オブジェクトを持つことを意味します。アプリケーションスコープ全体ではなくオブジェクトスコープでシングルトンになります。あなたは、私がsemaforeとして使用されるように、新しいオブジェクトを導入するthis answer

に似た何かをすることをお勧めしたい - それは信任状がリフレッシュされている「たびにブロックされます。 「リフレッシュクレデンシャル」コールを1つだけ作成するようにするには、オブジェクトと同期するコードのブロックでコールする必要があります。

+0

はい、私は問題を数か月前に解決しました。私は要求のトークンが保存されたトークンと同じであるかどうかをチェックするシンクロナイズド機能を持つシングルトンを使用しています。同じ場合は、トークンがまだリフレッシュされていないことを意味します。したがって、リフレッシュを実行します。そうでなければ、次の要求は、リフレッシュされたトークンで要求を再度実行します。 – antonicg

+0

あなたはそれを解決した - 私はそれを知らなかった。実際に私が提案したのと同じアプローチですが、唯一の違いは、シングルトンのメソッドをブロックし、コードのブロックをブロックすることです。もちろん、メソッドに抽出できるので、同じです –

関連する問題