У меня есть проект Android, в котором я получаю токен от сервера для аутентификации и использую его для дальнейших запросов к серверу. Значок истекает примерно через 10 минут, поэтому я должен получить новый. Мой текущий шаблон выглядит так:
1- Выбирать токен, когда пользователь сначала запускает приложение
2- Блокируйте ввод пользователя с диалоговым окном "Подождите", чтобы он не пытался отправлять запросы с помощью нулевого токена из других видов активности
3- Сохранить токен и метку времени, остановить блокировку ввода пользователем
4- Регулярно onCreate()
метку в onCreate()
действий
5- При необходимости обновите.
Моя проблема в этом; если пользователь открывает действие, и токен истек, мое приложение снова блокирует ввод пользователя и пытается извлечь токен. Однако в фоновом режиме нормальная логика/поток приложения продолжается, и он пытается отправить запрос на сервер со старым или нулевым токеном.
Поэтому я хочу заблокировать эту задачу запроса -which - это AsyncTask
как токен fetching-, и запустить его после завершения финализации. Как я могу использовать этот шаблон и является ли он правильным?
Сделать один поток ждать, пока другой закончит?
Я бы подумал об использовании менеджера Android Account с помощью специального аутентификатора для обработки токенов. SampleSyncAdapter показывает вам, как это сделать. Используйте AccountManager getAuthToken для получения текущего токена. В аутентификаторе вы можете включить логику для недействительности токенов при тайм-ауте, что приведет к тому, что аутентификатор при следующем запросе на токен будет обращаться к серверу.
Но я думаю, это может быть слишком много накладных расходов для вашего проекта, чтобы реализовать это. Два подхода, которые я вижу для вашей текущей настройки:
Для блокировки используйте примитивы синхронизации Java. Например, создайте объект "lock" и используйте его в async-задаче и обновите токен:
protected Result doInBackground(Params... params) {
//
// the request and other stuff that does not require the token.
synchronized(lock) {
//
// communicate with the server.
}
}