Сохранять HTTP/REST-запросы в случае отсутствия соединения

В настоящее время я разрабатываю приложение для Android, используя HTTP/REST-запросы для связи с моим бэкэндом. Я пока не использую какую-либо конкретную библиотеку, так как до сих пор встроенный HttpURLConnection прекрасно работает для меня. Однако я хотел бы иметь какой-то резервный механизм, если мои запросы не выполняются из-за проблем с подключением. Аналогичная проблема также описана в https://stackru.com/questions/31786486/android-volley-internet-queue но пока не получила ответа, а другие связанные посты скорее фокусируются на кэшировании более старых ответов для перенаправления запросов в кеш, когда есть нет подключения доступно.

До сих пор я думал об использовании Volley, но, насколько я понимаю, он позволяет только повторить неудачный запрос, пока он, наконец, не соединится. Я думаю, что было бы более чистым решением кэшировать неудавшийся запрос и попытаться повторно отправить его после того, как я зарегистрировал изменение в своем состоянии подключения через BroadcastReceiver. Есть ли существующее решение, которое делает это для меня, или мне нужно настроить внутреннюю базу данных и управлять всем процессом самостоятельно?

TL; DR

Я хочу сохранить неудавшиеся запросы HTTP/REST на моем устройстве Android, когда мое устройство отключено, и повторно отправить их, когда устройство сможет снова установить соединение. Что я ищу?

2 ответа

Решение

У меня была такая же ситуация с отчетной службой. Я реализовал Службу, которая получает запросы и ставит их в очередь. В отдельном потоке (запускается при запуске службы) он проверяет очередь и пытается установить соединение. Если вы используете BlockingQueue, у вас есть "сигнализация" между потоками бесплатно, так что вам не нужно бездействовать.

Можно использовать настройку получателя для событий WifiManager.WIFI_STATE_CHANGED_ACTION и / или ConnectivityManager.CONNECTIVITY_ACTION, чтобы запустить службу или пробудить поток и попытаться повторно отправить его, когда соединение снова установится.

Я предлагаю услугу, чтобы вы могли отсоединить все это от кода в своей деятельности и иметь некоторые средства для его запуска и остановки. Я лично использовал IntentService, потому что это позволяет мне сериализовать запросы через Intents, и позволяет ОС обрабатывать отправку управления Intent для меня. Вы можете реализовать его по-другому, даже без службы, просто с помощью объекта Singleton.

Если вам также нужно хранить их, когда ваше приложение не запущено, я бы использовал базу данных SQLite.

Как писал @Sebastian, вы можете написать обработчик очереди самостоятельно или, возможно, проверить, не будут ли вам полезны существующие реализации, такие как https://g ithub.com/yig it/android-priority-jobqueue/issues.

Другие вопросы по тегам