Health Connect: использование getGrantedPermissions() с асинхронной сопрограммой останавливает процесс при await() ⇐ Android
Health Connect: использование getGrantedPermissions() с асинхронной сопрограммой останавливает процесс при await()
HealthConnectClient.permissionController.getGrantedPermissions() замораживает процесс при вызове внутри асинхронной сопрограммы с помощью await()
Эта ошибка не возникает, если ранее было запущено намерение с использованием PermissionController.createRequestPermissionResultContract().
Простой код, подобный этому, воспроизводит ошибку:
Private val PERMISSIONS = setOf(HealthPermission.getReadPermission(StepsRecord::class)) частное развлечение syncCheckPermissions(healthConnectClient:HealthConnectClient): Boolean { val предоставлено: Boolean = runBlocking { пытаться { withTimeout(5000) { GlobalScope.async { val предоставлено = healthConnectClient.permissionController.getGrantedPermissions() предоставлено.containsAll(РАЗРЕШЕНИЯ) }.Ждите() } } catch (e: TimeoutCancellationException) { return@runBlocking true } } возвращение предоставлено } Когда getGrantedPermissions() заменяется любой фиктивной функцией, тайм-аут не срабатывает.
Я не уверен, связана ли ошибка с библиотекой или моим кодом. Есть ли другой способ получить результат без приостановки из функции приостановки?
Изменить: я знаю, что runBlocking блокирует процесс до тех пор, пока не будет выполнено ожидание, и не возникнет ошибка, ожидание никогда не возвращает результат, и в конце концов я получил ANR от системы.
HealthConnectClient.permissionController.getGrantedPermissions() замораживает процесс при вызове внутри асинхронной сопрограммы с помощью await()
Эта ошибка не возникает, если ранее было запущено намерение с использованием PermissionController.createRequestPermissionResultContract().
Простой код, подобный этому, воспроизводит ошибку:
Private val PERMISSIONS = setOf(HealthPermission.getReadPermission(StepsRecord::class)) частное развлечение syncCheckPermissions(healthConnectClient:HealthConnectClient): Boolean { val предоставлено: Boolean = runBlocking { пытаться { withTimeout(5000) { GlobalScope.async { val предоставлено = healthConnectClient.permissionController.getGrantedPermissions() предоставлено.containsAll(РАЗРЕШЕНИЯ) }.Ждите() } } catch (e: TimeoutCancellationException) { return@runBlocking true } } возвращение предоставлено } Когда getGrantedPermissions() заменяется любой фиктивной функцией, тайм-аут не срабатывает.
Я не уверен, связана ли ошибка с библиотекой или моим кодом. Есть ли другой способ получить результат без приостановки из функции приостановки?
Изменить: я знаю, что runBlocking блокирует процесс до тех пор, пока не будет выполнено ожидание, и не возникнет ошибка, ожидание никогда не возвращает результат, и в конце концов я получил ANR от системы.
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение