Android-приложение ANR из-за автонавигации после долгого сна - PullRequest
0 голосов
/ 04 июля 2019

У меня есть приложение, которое работает в режиме киоска в течение длительных периодов времени (дней).Он остается на фрагменте 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 нет ошибок, и проблема возникает только изредка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...