問題描述
在我們使用按鍵點擊觸發 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