2012-09-02 3 views
2

저는 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를 실행하는 작업 또는 서비스를 사용할 수있는 클라이언트 측

답변