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()
}
这将 运行 主线程上的代码,无论该代码是否位于另一个线程中
我有另一个 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()
}
这将 运行 主线程上的代码,无论该代码是否位于另一个线程中