LINUX.ORG.RU

андроидо-виджет и синхронизация данных в условиях разрывов связи

 , , ,


0

2

Собрался я значит написать простенький виджет для андроида: раз в два часа тягает данные с REST-API и выводит одну цифорку. Всё бы ничего, да захотелось, чтобы, если по отсутствию интернета очередной сеанс связи провалился, виджет бы обновился тогда, когда появится интернет, а не по расписанию.

Я нашёл в доках, что можно сделать отдельный BroadcastReceiver, подписанный на событие «смена состояния подключения». Чтобы батарейку лишний раз не жрать, его рекомендуется активировать по необходимости. В моём случае, видимо, - при неудавшейся попытке обновиться по расписанию. Вроде всё понятно, но вместе как-то сложно выходит. Смотрите:

  • AppWidgetProvider просыпается по расписанию, создаёт асинхронную задачу на обновление (выполняемую в отдельном потоке) - андроид не даёт лазить в сеть из основного потока
  • асинхронная задача лезет в сеть. Если не получилось и BroadcastReceiver для событий подключения ещё не активирован - его активирует. Если получилось, то BroadcastReceiver деактивируется.
  • BroadcastReceiver для событий подключения вызывает ту же задачу обновления

А теперь самая хитрость: как эту всю котовасию синхронизировать, чтобы одновременно никто из двух потоков не полез view виджета обновлять, и чтобы, если AppWidgetProvider и BroadcastReceiver проснулись примерно одновременно, не было двух обращений к REST-API.

Может я что-то перемудрил и можно проще?


Ответ на: комментарий от orm-i-auga

Сомневаюсь. По дефолту в этот же обработчик приходит инфа об удалении виджета. Если отключу, то не смогу почистить state за собой.

migesok
() автор топика
Ответ на: комментарий от Boy_from_Jungle

До меня, кажется, стало доходить.

Колбек AsyncTask, в котором делается работа с результатом долгоиграющей задачи, выполняется в UI-потоке, так что проблем с одновременным выполнением быть не должно.

Ещё понял, что методы BroadcastReceiver'ов выполняются тоже в одном треде в пределах одного приложения, так что проблем с одновременным получением уведомлений быть не должно.

Походу ничего синхронизировать не надо.

migesok
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.