WorkManager с `.setRequiredNetworkType(NetworkType.UNMETERED)` не имеет активного подключения к Интернету внутри `doWorkAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 WorkManager с `.setRequiredNetworkType(NetworkType.UNMETERED)` не имеет активного подключения к Интернету внутри `doWork

Сообщение Anonymous »

Я создаю приложение для резервного копирования, которое создает резервные копии некоторых файлов по ночам. Потому что это должно происходить каждую ночь примерно в одно и то же время, когда я использую OneTimeWorkRequest, который будет запланирован снова после последнего запуска. Итак, вот код, который я использую:

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

private fun scheduleNextSyncWorker(context: Context) {
val nextScheduleDelay = 60000L

val test = OneTimeWorkRequestBuilder()
.setInitialDelay(nextScheduleDelay, TimeUnit.MILLISECONDS)
.setConstraints(
Constraints.Builder()
.setRequiredNetworkType(NetworkType.UNMETERED)
.build()
)
.addTag("test")
.build()
WorkManager.getInstance(context)
.enqueueUniqueWork("test", ExistingWorkPolicy.REPLACE, test)
}

class TestWorker(appContext: Context, workerParameters: WorkerParameters) : CoroutineWorker(appContext, workerParameters) {
override suspend fun doWork(): Result {
try {
withContext(Dispatchers.IO) {
val connectivityManager = applicationContext.connectivityManager()
var waitedMillis = 0L
var waitedSince = System.currentTimeMillis()

// Added this to check if it is connected and usually this is false
while(connectivityManager.activeNetworkInfo?.isConnected != true && waitedMillis < 10000) {
Log.d("TEST", "connected: ${connectivityManager.activeNetworkInfo?.isConnected}")
waitedMillis = System.currentTimeMillis() - waitedSince
delay(1000)
}

// Api calls here which mostly fail because no internet connection
}
return Result.success()
} catch (t: Throwable) {
return Result.failure()
} finally {
GlobalScope.launch {
// Probably not the best way, but the worker needs to pass back that we succeeded or failed before we will schedule the next
delay(1000)
scheduleNextSyncWorker(applicationContext)
}
}
}
}
Этот код будет работать нормально, пока приложение находится на переднем плане. Однако как только я перемещаю приложение в фоновый режим и блокирую устройство, большинство вызовов API завершаются с ошибкой java.net.UnknownHostException: невозможно разрешить хост «graph.microsoft.com»: с именем хоста не связан адрес.
Как вы можете видеть в коде, у меня есть дополнительный код, чтобы проверить, подключены ли мы в данный момент, что, когда устройство заблокировано, в основном ложно. Иногда через несколько секунд мы восстанавливаем доступ в Интернет, но иногда нет.
Я думал, что WorkManager должен был вызывать doWork только в том случае, если ограничения соблюдены. Но поскольку у меня нет активного соединения, я не знаю, как мне продолжать. Кажется тривиальным добавить полную проверку сети внутри воркера, хотя он должен проверять ее сам.
Есть какие мысли?

Подробнее здесь: https://stackoverflow.com/questions/793 ... -no-active
Ответить

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

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

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

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

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