Вариант использования:
Когда срабатывает геозона, нам нужно связаться с сервером как можно скорее. Мы решили эту проблему с помощью неявного BroadcastReceiver, вызывающего Сервис в течение нескольких лет, но проблематичным в новых версиях из-за ограничений фона Doze и Oreo.
Попытки исправить:
Мы переместили регистрацию геозоны из неявного -> явного широковещательного приемника, чтобы обойти ограничение «фонового режима».
Мы попытались сделать это, как в примерах Googles, то есть получатель широковещания вызвал enqueueWork () на JobIntentService . Проблема в том, что мы часто замечали длительную «задержку» между тем, когда задание было запланировано и когда оно действительно выполнялось. Наш рекорд больше часа!
Итак, вместо этого мы попытались перенести все функции в BroadcastReceiver и использовать goAsync () для выполнения сетевого вызова. (если вы попытаетесь выполнить сетевую операцию синхронно, вы получите исключение «нет сети из основного потока»).
Это работает, поскольку мы можем запустить поток и выполнить код, но сетевая операция доставляет нам проблемы.
Проблема:
Итак, наше текущее решение из-за вышеуказанных проблем является явным BroadcastReceiver, использующим goAsync () для выполнения вызова сервера.
Тем не менее, сетевой вызов работает очень периодически. Мы довольно часто получаем ошибки " java.net.SocketException: Socket is closed ". Это не проблема сервера, и она всегда работает при вызове из нашего «обычного» кода приложения.
Я не уверен, почему это происходит, но я подозреваю, что режим Doze? Хотя я не уверен, как получить его, когда Receiver фактически вызывается триггером геозоны.
Вопросы:
Кто-нибудь знает, почему из-за нашей goAsync () происходит сбой работы сети? Опять же, многопоточность работает, просто мы получаем ошибки сокета при фактической работе сети.
Есть ли в более новых версиях Android какой-либо путь от триггера геозоны для прямого сетевого вызова, как мы и пытаемся сделать, помимо того, что мы уже пробовали?
Указатели и мысли очень ценятся!