У меня есть приложение, которое работает в режиме киоска в течение длительных периодов времени (дней).Он остается на фрагменте A в течение 8 часов, затем после этого он должен автоматически перейти к фрагменту B. Иногда это создает ANR, и приложение никогда не получает фрагмент B (на самом деле onCreateView из фрагмента B не вызывается).
Я нахожусь на фрагменте A, и если основная задача приложения выполнена, я вызываю следующее:
flag = true
if (screenService.isScreenOn())
navigator.goToFragmentB()
Экран может выключиться, и навигация не происходит.
В onResume фрагмента AI есть следующий код
super.onResume()
if (flag)
navigator.goToFragmentB()
. Если я включаю планшет в течение двух часов после установки значения флага выше, все в порядке, и я нахожусь на фрагменте B по желанию.Но если я подожду 3-4 часа или больше, иногда приложение остается во фрагменте A и перестает отвечать на запросы (ANR).
Это код, который я использую для навигации:
val navController = getNavController(fragment)
if (navController != null && canNavigate(navController, actionId)) {
Handler(Looper.getMainLooper()).post {
navController.navigate(actionId)
}
} else {
logNavError()
}
private fun canNavigate(navController: NavController, actionId: Int): Boolean {
return navController.currentDestination?.getAction(actionId) != null
}
У меня есть способ заставить его работать, включив экран сразу после того, как флаг станет истинным, и выполнив навигацию к B там.Однако это означает, что я включаю экран приложения, когда пользователь может спать.
В logcat нет ошибок, и проблема возникает только изредка.