Собрался я значит написать простенький виджет для андроида: раз в два часа тягает данные с REST-API и выводит одну цифорку. Всё бы ничего, да захотелось, чтобы, если по отсутствию интернета очередной сеанс связи провалился, виджет бы обновился тогда, когда появится интернет, а не по расписанию.
Я нашёл в доках, что можно сделать отдельный BroadcastReceiver, подписанный на событие «смена состояния подключения». Чтобы батарейку лишний раз не жрать, его рекомендуется активировать по необходимости. В моём случае, видимо, - при неудавшейся попытке обновиться по расписанию. Вроде всё понятно, но вместе как-то сложно выходит. Смотрите:
- AppWidgetProvider просыпается по расписанию, создаёт асинхронную задачу на обновление (выполняемую в отдельном потоке) - андроид не даёт лазить в сеть из основного потока
- асинхронная задача лезет в сеть. Если не получилось и BroadcastReceiver для событий подключения ещё не активирован - его активирует. Если получилось, то BroadcastReceiver деактивируется.
- BroadcastReceiver для событий подключения вызывает ту же задачу обновления
А теперь самая хитрость: как эту всю котовасию синхронизировать, чтобы одновременно никто из двух потоков не полез view виджета обновлять, и чтобы, если AppWidgetProvider и BroadcastReceiver проснулись примерно одновременно, не было двух обращений к REST-API.
Может я что-то перемудрил и можно проще?