1

サーバーから認証用のトークンを取得し、それをサーバーへのさらなるクエリに使用するAndroidプロジェクトがあります。トークンは約10分で期限切れになるため、新しいトークンを取得する必要があります。私の現在のパターンは次のようなものです。

1-ユーザーが最初にアプリケーションを起動したときにトークンを取得します

2-「お待ちください」ダイアログでユーザー入力をブロックして、他のアクティビティからnullトークンを使用してクエリを送信しようとしないようにします

3-トークンとタイムスタンプを保存し、ユーザー入力のブロックを停止します

4-onCreate()アクティビティのメソッドでタイムスタンプを定期的に確認します

5-必要に応じて更新します。

私の問題はこれです。ユーザーがアクティビティを開き、トークンの有効期限が切れた場合、アプリケーションは再びユーザー入力をブロックし、トークンをフェッチしようとします。ただし、バックグラウンドでは、アプリケーションの通常のロジック/フローが続行され、古いトークンまたはnullトークンを使用してサーバーにクエリを送信しようとします。

したがって、このクエリタスク(AsyncTaskトークンのフェッチに似ています)をブロックし、トークンのフェッチが終了した後に開始します。このパターンをどのように使用できますか?これは正しいパターンですか?

あるスレッドを別のスレッドが終了するのを待たせますか?

4

1 に答える 1

1

トークンを処理するためのカスタム認証システムで Android アカウント マネージャーを使用することを検討します。SampleSyncAdapterは、それを進める方法を示しています。AccountManagerの getAuthToken を使用して、現在のトークンを取得します。オーセンティケーターには、タイムアウト時にトークンを無効にするロジックを含めることができます。これにより、トークンの次のリクエストでオーセンティケーターがサーバーに接続します。

しかし、プロジェクトがこれを実装するにはオーバーヘッドが多すぎる可能性があると思います。現在の設定で私が見る2つのアプローチ:

  1. 新しいトークンを取得した後、単に現在のクエリをキャンセルして新しいクエリを起動することはできますか?
  2. Java 同期プリミティブを使用してブロックします。たとえば、「ロック」オブジェクトを作成し、非同期タスクとトークンを更新する場所で使用します。

    protected Result doInBackground(Params... params) {
        //
        // the request and other stuff that does not require the token.
    
        synchronized(lock) {
            //
            // communicate with the server.
        }
    }
    
于 2012-05-25T07:19:14.707 に答える