저는 wifi (안드로이드)를 통해 휴대 전화와 통신하는 JavaFX 애플리케이션을 구현하고 있습니다.javafx.concurrent로 JavaFX 네트워크 백그라운드 작업
public class Handler implements Runnable {
private final Socket client;
private final ServerSocket serverSocket;
private RoutePlannerJFX application;
private UserData userData;
Handler(ServerSocket serverSocket,Socket client, RoutePlannerJFX app, UserData data) {
this.client = client;
this.serverSocket = serverSocket;
application = app;
userData = data;
}
public void run() {
StringBuffer sb = new StringBuffer();
PrintWriter out = null;
try {
System.out.println("running service, " + Thread.currentThread());
out = new PrintWriter(client.getOutputStream(), true);
BufferedReader bufferedReader =
new BufferedReader(
new InputStreamReader(
client.getInputStream()));
char[] buffer = new char[100];
int anzahlZeichen = bufferedReader.read(buffer, 0, 100);
String nachricht = new String(buffer, 0, anzahlZeichen);
String[] werte = nachricht.split("\\s");
System.out.println(nachricht+"\n");
POI poi = new POI(nachricht);
userData.addItemToPoiList(poi);
application.setScene("INSTRUCT");
} catch (IOException e) {System.out.println("IOException, Handler-run");}
finally {
System.out.println(sb); //Rückgabe Ergebnis an den Client
if (!client.isClosed()) {
System.out.println("****** Handler:Client close");
try {
client.close();
} catch (IOException e) { }
}
}
}
}
응용 프로그램이 장면을 변경하는 공공 방법이있다 (setScene : 핸들러를 가지고
public class NetworkService implements Runnable {
private final ServerSocket serverSocket;
private final ExecutorService pool;
private RoutePlannerJFX application;
private UserData userData;
public NetworkService(ExecutorService pool,
ServerSocket serverSocket,
RoutePlannerJFX app,
UserData data) {
this.serverSocket = serverSocket;
this.pool = pool;
application = app;
userData = data;
}
public void run() {
try {
while (true) {
Socket cs = serverSocket.accept();
pool.execute(new Handler(serverSocket, cs, application, userData));
}
} catch (IOException ex) {
System.out.println("--- Interrupt NetworkService-run");
}
finally {
System.out.println("--- Ende NetworkService(pool.shutdown)");
pool.shutdown(); //keine Annahme von neuen Anforderungen
try {
pool.awaitTermination(4L, TimeUnit.SECONDS);
if (!serverSocket.isClosed()) {
System.out.println("--- Ende NetworkService:ServerSocket close");
serverSocket.close();
}
} catch (IOException e) { }
catch (InterruptedException ei) { }
}
}
}
: 따라서
나는 백그라운드 프로세스에서 실행되는 자바 FX의 서버 스레드가()).
그게 내가 할 수 있었으면 좋겠지 만, 이제는 내가 알기 론, 내 백그라운드 프로세스에서 장면을 전환 할 수 없다는 것을 알았습니다.
이 문제를 어떻게 구현할 수 있습니까? 내 백그라운드 프로세스가 클라이언트로부터 메시지를 수신 할 때 액션을 수행해야하지만, 가장 좋은 방법은 무엇인지 모르겠다 ... 이미 javafx.concurrent를 찾았지만 사용하고 어떻게해야합니까?
감사합니다. 당신은 당신이 게시물에 너무 JavaFX Async Task
을 확인할 수 있습니다 documentation에 설명 된대로 별도의 스레드 & 업데이트에 GUI를 실행하는 작업 또는 서비스를 사용할 수있는 클라이언트 측