我有一个可以在信息亭模式下运行很长时间(几天)的应用。它会在片段A上停留8个小时,然后它会自动移动到片段B。有时会产生ANR,而应用程序再也不会到达片段B(实际上,不会调用片段B的onCreateView)。
我在片段A上,如果应用程序的主要任务已经完成,我会调用以下代码:
flag = true
if (screenService.isScreenOn())
navigator.goToFragmentB()
虽然屏幕可能会熄灭,但导航不会发生。
在片段A的onResume中,我有以下代码
super.onResume()
if (flag)
navigator.goToFragmentB()
如果在上述标志设置为true的两个小时内打开平板电脑,一切都很好,并且我位于所需的片段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
}
我有一种方法可以通过在标志变为true之后立即打开屏幕并在那里导航到B来使其工作。但是,这意味着我可能在用户可能正在睡觉的时候打开应用程序的屏幕。
logcat中没有错误,该问题仅偶尔发生。