Closed6

画面遷移できない | 明示的にUIスレッドを呼び出す

実装していたら、「あれ?画面遷移しないぞ?」となった

findNavController().navigate(direction)

実行すると

I/NavController: Ignoring popBackStack to destination com.example:id/mainFragment as it was not found on the current back stack
W/System.err: androidx.fragment.app.Fragment$InstantiationException: Unable to instantiate fragment com.example.application.presenter.fragment.ExampleFragment: calling Fragment constructor caused an exception
W/System.err:     at androidx.fragment.app.Fragment.instantiate(Fragment.java:566)
W/System.err:     at androidx.fragment.app.FragmentContainer.instantiate(FragmentContainer.java:57)
W/System.err:     at androidx.fragment.app.FragmentManager$3.instantiate(FragmentManager.java:390)
W/System.err:     at androidx.navigation.fragment.FragmentNavigator.instantiateFragment(FragmentNavigator.java:132)
W/System.err:     at androidx.navigation.fragment.FragmentNavigator.navigate(FragmentNavigator.java:162)
        at androidx.navigation.fragment.FragmentNavigator.navigate(FragmentNavigator.java:58)
W/System.err:     at androidx.navigation.NavController.navigate(NavController.java:979)
        at androidx.navigation.NavController.navigate(NavController.java:913)
        at androidx.navigation.NavController.navigate(NavController.java:850)
W/System.err:     at androidx.navigation.NavController.navigate(NavController.java:836)
        at androidx.navigation.NavController.navigate(NavController.java:1031)
        at com.example.application.presenter.fragment.ContainerBaseFragment.navigate(ContainerBaseFragment.kt:21)
        at java.lang.Thread.run(Thread.java:761)
    Caused by: java.lang.reflect.InvocationTargetException
        at java.lang.reflect.Constructor.newInstance0(Native Method)
W/System.err:     at java.lang.reflect.Constructor.newInstance(Constructor.java:430)
        at androidx.fragment.app.Fragment.instantiate(Fragment.java:548)
        ... 16 more
    Caused by: java.lang.IllegalStateException: Method addObserver must be called on the main thread
        at androidx.lifecycle.LifecycleRegistry.enforceMainThreadIfNeeded(LifecycleRegistry.java:317)
        at androidx.lifecycle.LifecycleRegistry.addObserver(LifecycleRegistry.java:172)
        at androidx.fragment.app.Fragment.initLifecycle(Fragment.java:496)
        at androidx.fragment.app.Fragment.<init>(Fragment.java:476)
        at com.example.application.presenter.fragment.ContainerBaseFragment.<init>(ContainerBaseFragment.kt:11)
        ... 19 more
D/EventNotifyStatusIO: Error Stop
    Termination

どうやら別スレッドで動いているらしい
ので明示的にUIスレッドを呼び出したい

どうすれば良いのか

この問題を修正するために、Android には、他のスレッドから UI スレッドにアクセスする方法がいくつか用意されています。使用できるメソッドは次のとおりです。

  • Activity.runOnUiThread(Runnable)
  • View.post(Runnable)
  • View.postDelayed(Runnable, long)

https://developer.android.com/guide/components/processes-and-threads?hl=ja
override fun onThreading() {
    // 別スレッド処理
    something()
    // UIスレッド指定
    view?.post {
         findNavController().navigate(direction)
    }
}

これで動いた
かんたん

このスクラップは3ヶ月前にクローズされました
ログインするとコメントできます