2016-08-04 36 views
0

Ich habe den folgenden Abschnitt von JavaFX, die Service Klasse implementiert:Service-Klasse läuft nicht

public void processingImage() { 

    Task<Void> track = new Task<Void>() { 

     @Override 
     protected Void call() throws Exception { 

      while (true) { 
       if (flag == false) { 
        if (someCondition) { 
         flag = true; 
         CommunicateServer.sendObject = new Object[2]; 
         CommunicateServer.sendObject[0] = 6; 
         CommunicateServer.sendObject[1] = "hello"; 

         myService.start(); 
         flag = false; 

         System.out.println("this line does not print"); 
       } 
      } 
      return null; 
     } 
    }; 
    Thread th1 = new Thread(track); 
    th1.setDaemon(true); 
    th1.start(); 
} 

Und die MyService Klasse implementiert als:

private class MyService extends Service<Void> { 

    @Override 
    protected Task<Void> createTask() { 
     return new Task<Void>() { 
      @Override 
      protected Void call() throws Exception { 

        CommunicateServer.callSendObject(CommunicateServer.sendObject, true); 
        response = CommunicateServer.getObject(); 
        System.out.println("this print should have been many times but only executed once!!!!"); 

       return null; 
      } 
     }; 
    } 
} 

Mein Problem ist, obwohl ich den Code erwarten Zum Drucken this line does not print wird der Code tatsächlich nicht gedruckt. Außerdem wird die Zeile this print should have been many times but only executed once!!!! nur einmal gedruckt, obwohl ich denke, dass sie viele Male gedruckt worden sein sollte. Ich weiß nicht, wie ich dieses Problem beheben kann. Jede Hilfe oder Anregung wird mit Dankbarkeit erfüllt.

Antwort

1

Es ist nicht wirklich klar, was Sie von Ihrem Code erwarten, aber Service.start()should be called from the FX Application Thread. Da Sie es aus einem Hintergrundthread aufrufen, kann dies eine Ausnahme auslösen, die Sie daran hindert, die System.out.println(...)-Anweisung zu erreichen.

Darüber hinaus muss der Dienst in der READY Zustand sein, den Anruf zu start() zu empfangen, so auf der zweiten Ausführung (falls vorhanden), da der Dienst nicht zurückgesetzt wurde, erhalten Sie eine IllegalArgumentException erhalten, Austritt aus dem call() Methode in der Task definiert in processingImage(). Daher wird Ihr Service höchstens einmal ausgeführt.

+0

Danke für die Antwort. Das hat funktioniert!!!!! Ich war mir nicht sicher, aber allmählich lernte ich es :) –