问题描述
在我们使用按键点击触发 Navigation.findNavController(getView()).navigate(R.id.action_aFragment_to_bFragment); 代码跳转到另一个碎片时,在很低的概率下会出现这个 navigation destination xxx is unknown to this NavController 报错问题。这个问题的意思是在启动Fragment的时候,它需要启动的Fragment不存在。
问题原因
原因很简单,你没有在在点击里做防止连点的机制。 特别是设备在很卡的情况下。 连点会导致多次跳转Fragment,而Navigation启动的Fragment只有一个实例,而连点导致极端短时间内同时启动Fragment,会一些点击并没有Fragment来启动。
复现问题
你可能会不相信我上面的问题原因说明,因为一般设备在正常的情况下你很难触发这个bug。只有在设备很卡的时候才会出现,我们为了复现这个问题只需要下面这条命令创建一个设备很卡的环境:
adb shell dd if=/dev/zero of=/storage/sdcard0/file bs=1073741824 count=10
这个命令会让设备生成一个占用文件,让设备剩余空间被占满。注意,并不是真正使用了存储空间。然后你只需要在启动Navigation.findNavController(getView()).navigate() 的按键里连点多次就可以触发这个报错了
解决问题办法
做一个防止连点的机制即可,参考我的博客:https://www.cnblogs.com/guanxinjing/p/10905850.html