0

This is my Fragment.kt

class SplashFragment : Fragment() {

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {

        return inflater.inflate(R.layout.fragment_splash, container, false)
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
            // My Timer
            Timer().schedule(object : TimerTask() {
                override fun run() {
                    findNavController().navigate(SplashFragmentDirections.actionSplashFragmentToHomeFragment()))
                }
            }, 2000)

    }
}

This is my Logcat error

2022-02-06 20:37:34.755 27478-27510/com.finite.livelocationtest E/AndroidRuntime: FATAL EXCEPTION: Timer-0
    Process: com.finite.livelocationtest, PID: 27478
    java.lang.NullPointerException: Can't toast on a thread that has not called Looper.prepare()
        at com.android.internal.util.Preconditions.checkNotNull(Preconditions.java:157)
        at android.widget.Toast.getLooper(Toast.java:179)
        at android.widget.Toast.<init>(Toast.java:164)
        at android.widget.Toast.makeText(Toast.java:492)
        at android.widget.Toast.makeText(Toast.java:480)
        at com.finite.livelocationtest.ui.fragment.SplashFragment$onViewCreated$1.run(SplashFragment.kt:31)
        at java.util.TimerThread.mainLoop(Timer.java:562)
        at java.util.TimerThread.run(Timer.java:512)

我想达到什么目标?

我想在 2 秒后从这个片段转到下一个片段,请告诉我任何可能的方法来实现这一点。

4

3 回答 3

0

您包含的异常告诉我您正在尝试Toast在非 UI 线程上显示 a 。我在您的示例中没有看到任何 toast 调用,请注意,您不能在非 UI 线程上显示 Toast。您需要从主线程中调用 Toast.makeText() (以及处理 UI 的大多数其他函数)。

于 2022-02-06T15:27:49.403 回答
0

只需使用 Android 处理程序延迟 2 秒。这是代码示例

Handler(Looper.getMainLooper()).postDelayed({
   //this portion is run when the handler is completing 2 second of delay
}, 2000)

适用于活动和片段

于 2022-02-08T12:29:32.513 回答
0

我们可以使用协程,而不是尝试使用 Timer 类。

lifecycleScope.launch {
  delay(2000)
  findNavController().navigate(SplashFragmentDirections.actionSplashFragmentToHomeFragment()))
}

使用它解决了我遇到的问题,我的应用程序崩溃的原因是我试图从后台线程执行 UI 相关的事情,因为它是一个非 UI 线程,所以它不起作用,所以我们需要做它在主线程上。

于 2022-02-06T15:31:07.617 回答