Почему мой WorkManager Work никогда не подключается к Интернету при работе в фоновом режиме?Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Почему мой WorkManager Work никогда не подключается к Интернету при работе в фоновом режиме?

Сообщение Anonymous »

Я использую WorkManager в своем приложении Android для выполнения некоторой фоновой работы.
Эта работа заключается в использовании Интернета для HTTP-запросов POST к API.
Когда приложение работает на переднем плане, все работает отлично, но в фоновом режиме моей работе постоянно не хватает Интернета, поэтому запрос POST часто завершается сбоем.
Я не могу заставить его работать надежно на моем эмуляторе Pixel 7 API 35 - почему это может быть?

Обратите внимание, что я не хочу устанавливать ограничение NetworkType.CONNECTED для работы, поскольку его основной целью является отслеживание местоположения, а не интернет-часть.

Мой AndroidManifest.xml:

Код: Выделить всё

MainActivity.kt
– задержка в 20 секунд позволяет мне перейти в другое место на переднем плане до запуска работы:

Код: Выделить всё

val oneTimeRequest = OneTimeWorkRequestBuilder()
.setInitialDelay(20, TimeUnit.SECONDS)
.build()
WorkManager.getInstance(context)
.enqueue(oneTimeRequest)

Код: Выделить всё

Worker.kt
:

Код: Выделить всё

class LocationWorker(
context: Context,
workerParams: WorkerParameters
): CoroutineWorker(context, workerParams) {

override suspend fun doWork(): Result {

// ... (doing some geolocation and database stuff)

if (isNetworkAvailable(applicationContext)) {
// Always get here when the app is visible on-screen
Log.d("LocationWorker", "All fine.")
} else {
// Always get here when not having the app on-screen
Log.d("LocationWorker", "Network not available.")
}
}

private fun isNetworkAvailable(context: Context): Boolean {
val connectivityManager = context.getSystemService(ConnectivityManager::class.java)
val network = connectivityManager.activeNetwork ?: return false
val capabilities = connectivityManager.getNetworkCapabilities(network) ?: return false
return capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
}
Я убедился, что на самом устройстве включен Wi-Fi, приложение не лишается разрешений, когда оно не используется, и все разрешения разрешены.
Минимальная версия SDK — 29 (Android 10).
Минимальная демо-версия для воспроизведения проблемы: иногда работает
Обновление:
Иногда сеть Соединение работает безупречно в фоновом режиме. Иногда нет. Иногда два раза терпит неудачу, а потом чудесным образом работает с третьей попытки. Сейчас я видел много комбинаций без какой-либо узнаваемой детерминированной схемы.
Теперь проблема в том, что это работает ненадежно (больше похоже на подбрасывание монеты).
Я создал минимальный пример проблемы на GitHub.
Второй коммит показывает все, что есть в приложении (плюс README.md).
Проверьте, протестируйте согласно инструкциям в README.md и наблюдайте за проблемой.

Возможно, эта проблема существует только на моем эмуляторе, а не на реальных устройствах - я тестирую это прямо сейчас...


Подробнее здесь: https://stackoverflow.com/questions/794 ... ing-in-the
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»