当 DataInputStream 处于 while 循环时,JavaFX GUI 卡住了
JavaFX GUI stuck when DataInputStream is in while loop
我已经想了一段时间了,
我正在尝试编写一个聊天服务器应用程序,仅供学习。
我有一个我无法理解的障碍,
GUI 内部的 while 循环 class 冻结,但就在它尝试读取时:
public void run(){
Platform.runLater(() -> {
do {
try {
msg = getFromServer.readUTF(); // <--- freeze GUI
chatWindow.appendText(msg);
} catch (IOException e) {
e.printStackTrace();
}
} while (true);
});
}
你可以看到它在一个线程中 运行,但我确实尝试 运行 它以其他方式...
只有 DataInputStream 卡住了,
msg = getFromServer.readUTF();
这是它来自的方法:
public void connectToServer(){
try {
serverConectionState = new Socket("127.0.0.1", 6789);
getFromServer = new DataInputStream(serverConectionState.getInputStream());
sendToServer = new DataOutputStream(serverConectionState.getOutputStream());
onlineOffline.setText("Online");
onlineOffline.setTextFill(javafx.scene.paint.Color.web("#0076a3"));
} catch (IOException ex){
chatWindow.appendText("server connection fail\n");
}
}
这个 class 是 Controller.class - 如果有什么不同的话。
在社区的大量帮助下,我在 Whosebug 中的第一个问题。
提前致谢
我假设您展示的 run
方法是在后台线程中执行的 Runnable
的一部分。
您正在 运行 FX 应用程序线程上的整个循环(通过使用 Platform.runLater()
)。所以你阻塞了那个线程并阻止它重新绘制。您应该 运行 仅 UI 外汇应用程序线程上的更新:
public void run(){
do {
try {
String msg = getFromServer.readUTF(); // <--- freeze GUI
Platform.runLater(() -> chatWindow.appendText(msg));
} catch (IOException e) {
e.printStackTrace();
}
} while (true);
}
你应该使用 java task 而不是 platform.runlater,这样你就可以 运行 不同线程中的代码,而不会冻结 UI线程
我已经想了一段时间了,
我正在尝试编写一个聊天服务器应用程序,仅供学习。 我有一个我无法理解的障碍,
GUI 内部的 while 循环 class 冻结,但就在它尝试读取时:
public void run(){
Platform.runLater(() -> {
do {
try {
msg = getFromServer.readUTF(); // <--- freeze GUI
chatWindow.appendText(msg);
} catch (IOException e) {
e.printStackTrace();
}
} while (true);
});
}
你可以看到它在一个线程中 运行,但我确实尝试 运行 它以其他方式...
只有 DataInputStream 卡住了,
msg = getFromServer.readUTF();
这是它来自的方法:
public void connectToServer(){
try {
serverConectionState = new Socket("127.0.0.1", 6789);
getFromServer = new DataInputStream(serverConectionState.getInputStream());
sendToServer = new DataOutputStream(serverConectionState.getOutputStream());
onlineOffline.setText("Online");
onlineOffline.setTextFill(javafx.scene.paint.Color.web("#0076a3"));
} catch (IOException ex){
chatWindow.appendText("server connection fail\n");
}
}
这个 class 是 Controller.class - 如果有什么不同的话。
在社区的大量帮助下,我在 Whosebug 中的第一个问题。
提前致谢
我假设您展示的 run
方法是在后台线程中执行的 Runnable
的一部分。
您正在 运行 FX 应用程序线程上的整个循环(通过使用 Platform.runLater()
)。所以你阻塞了那个线程并阻止它重新绘制。您应该 运行 仅 UI 外汇应用程序线程上的更新:
public void run(){
do {
try {
String msg = getFromServer.readUTF(); // <--- freeze GUI
Platform.runLater(() -> chatWindow.appendText(msg));
} catch (IOException e) {
e.printStackTrace();
}
} while (true);
}
你应该使用 java task 而不是 platform.runlater,这样你就可以 运行 不同线程中的代码,而不会冻结 UI线程