Эта работа заключается в использовании Интернета для HTTP-запросов POST к API.
Когда приложение работает на переднем плане, все работает отлично, но в фоновом режиме моей работе постоянно не хватает Интернета, поэтому запрос POST часто завершается сбоем.
Я не могу заставить его работать надежно на моем эмуляторе Pixel 7 API 35 - почему это может быть?
Обратите внимание, что я не хочу устанавливать ограничение NetworkType.CONNECTED для работы, поскольку его основной целью является отслеживание местоположения, а не интернет-часть.
Мой AndroidManifest.xml:
Код: Выделить всё
Код: Выделить всё
MainActivity.ktКод: Выделить всё
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)
}
Минимальная версия SDK — 29 (Android 10).
Минимальная демо-версия для воспроизведения проблемы: иногда работает
Обновление:
Иногда сеть Соединение работает безупречно в фоновом режиме. Иногда нет. Иногда два раза терпит неудачу, а потом чудесным образом работает с третьей попытки. Сейчас я видел много комбинаций без какой-либо узнаваемой детерминированной схемы.
Теперь проблема в том, что это работает ненадежно (больше похоже на подбрасывание монеты).
Я создал минимальный пример проблемы на GitHub.
Второй коммит показывает все, что есть в приложении (плюс README.md).
Проверьте, протестируйте согласно инструкциям в README.md и наблюдайте за проблемой.
Возможно, эта проблема существует только на моем эмуляторе, а не на реальных устройствах - я тестирую это прямо сейчас...
Подробнее здесь: https://stackoverflow.com/questions/794 ... ing-in-the
Мобильная версия