NavHostFragment.findNavController 抛出:必须在主线程上调用方法 addObserver

NavHostFragment.findNavController throw: Method addObserver must be called on the main thread

我有另一个 Fragment 可以使用此功能。但是当我收到服务器的响应时,程序崩溃并且 return 这个异常。我是 android 的新手,所以我不太了解导航工具的含义和功能。我不知道解决方案是否需要其他文件,顺便问一下 post 其他细节。

编辑:我发现问题是我试图通过另一个线程更改片段。我通常在使用 javaFX 时遇到此错误。有没有类似于“Platform.runlater()”的函数???

已解决:

  getActivity().runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            NavHostFragment.findNavController(LoginFragment.this).navigate(R.id.action_LoginFragment_to_FirstFragment);
                        }
                    });

在片段上:

 @Override
        public void onResponse(Call call, Response response) throws IOException {
            String sessione = "";
            String email = "";
            try {
                String msg = response.body().string();
                JSONObject obj = new JSONObject(msg);
                sessione = obj.getString("message");
                if (sessione.equals("sessione esistente")) {
                    email = obj.getString("email");
                    NavHostFragment.findNavController(LoginFragment.this).navigate(R.id.action_LoginFragment_to_FirstFragment);
                    //intent.putExtra("user", email);
                    //startActivity(intent);
                }
                Looper.prepare();
                Toast.makeText(getContext(), sessione, Toast.LENGTH_SHORT).show();
                Looper.loop();
            } catch (JSONException e) {
                System.out.println("Errore onResponse ----> " + e.getMessage());
                Toast.makeText(getContext(), sessione, Toast.LENGTH_SHORT).show();
                e.printStackTrace();
            }
        }});

nav_graph.xml:

<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
            xmlns:app="http://schemas.android.com/apk/res-auto"
            xmlns:tools="http://schemas.android.com/tools"
            android:id="@+id/nav_graph"
            app:startDestination="@id/FirstFragment">

    <fragment
            android:id="@+id/FirstFragment"
            android:name="com.example.progetto.FirstFragment"
            android:label="@string/first_fragment_label"
            tools:layout="@layout/fragment_first">

        <action
                android:id="@+id/action_FirstFragment_to_SecondFragment"
                app:destination="@id/SecondFragment"/>
    </fragment>

    <fragment
            android:id="@+id/SecondFragment"
            android:name="com.example.progetto.SecondFragment"
            android:label="@string/second_fragment_label"
            tools:layout="@layout/fragment_second">

        <action
                android:id="@+id/action_SecondFragment_to_FirstFragment"
                app:destination="@id/FirstFragment"/>
    </fragment>

    <fragment
            android:id="@+id/nav_home"
            android:name="com.example.progetto.FirstFragment"
            android:label="@string/menu_home"
            tools:layout="@layout/fragment_first">
    </fragment>
    <fragment
               android:id="@+id/nav_login"
               android:name="com.example.progetto.LoginFragment"
               android:label="@string/login"
               tools:layout="@layout/activity_login_page">
        <action
                android:id="@+id/action_LoginFragment_to_FirstFragment"
                app:destination="@id/FirstFragment"/>
    </fragment>


    <fragment
        android:id="@+id/nav_myLesson"
        android:name="com.example.progetto.myLesson.myLessonFragment"
        android:label="@string/menu_myLesson"
        tools:layout="@layout/fragment_my_lesson">
    </fragment>
</navigation>

在android中,如果你想在主线程上运行一段代码,你可以使用协程作用域,dispatcher context作为MAIN。例如-

CoroutineScope(Dispatchers.Main).launch {
    stuffYouWantOnTheMainThread()
}

这将 运行 主线程上的代码,无论该代码是否位于另一个线程中