我一直在試圖弄明白了一段時間,JavaFX的GUI卡住時DataInputStream類是在while循環
我試圖寫一個聊天 - 服務器應用程序,只是爲了學習。 我有一個障礙,我無法理解,
的GUI類凍結內部的while循環,但只是當它試圖讀取:
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();
這它methud,它的來自何處:
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");
}
}
這個類是Controller.class - 如果它使任何不同。
我在stackoverflow的第一個問題,在社區的很多幫助之後。
在此先感謝
正如下面的答案中所建議的那樣,只有當您想要更新UI並且不在這些線程中進行業務邏輯或數據操作時,您才必須使用'Platform.runLater()'。因此,在你的例子中,你應該調用一個'Runnable',當runnable完成工作時,它應該用'Platform.runLater()'更新UI。還要注意,對於大型應用程序,更好地使用ExecutorService,而不是根據需要產生線程 – AntJavaDev