2017-05-22 4 views
2

Ich versuche, eine App dazu zu bringen, eine Zeichenfolge aus einer Socket-Verbindung zu lesen, aber nach ein paar Stunden hört die App auf zu sprechen (ohne Ausnahmen). Ich bin sicher, dass die App noch läuft, weil der Server, der die Zeichenfolge sendet, weiterhin das Antwortecho nach dem Senden erkennt.TextToSpeech funktioniert nach ein paar Stunden nicht mehr

public class MainActivity extends AppCompatActivity { 


TextToSpeech textToSpeech; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    textToSpeech = new TextToSpeech(getApplicationContext(), new TextToSpeech.OnInitListener() { 
     @Override 
     public void onInit(int status) { 
      if(status != TextToSpeech.ERROR) { 
       textToSpeech.setLanguage(Locale.ITALY); 
      } 
     } 
    }); 

    Thread socketT = new Thread(new SocketThread()); 
    socketT.start(); 

} 

@Override 
public void onDestroy() { 
    if (textToSpeech != null) { 
     textToSpeech.stop(); 
     textToSpeech.shutdown(); 
    } 
    super.onDestroy(); 
} 


private class SocketThread extends Thread { 

    static final int socketPort = 3333; 

    @Override 
    public void run() { 
     try { 
      ServerSocket serverSocket = new ServerSocket(socketPort); 
      try { 
       while(true) { 
        Socket clientSocket = serverSocket.accept(); 
        try { 
         new ServerThread(clientSocket); 
        } catch(IOException e) { 
         clientSocket.close(); 
        } } 
      } 
      catch (IOException e) { 
      } 
      serverSocket.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    class ServerThread extends Thread { 
     private int counter = 0; 
     private int id = ++counter; 
     private Socket socket; 
     private BufferedReader in; 
     private PrintWriter out; 
     public ServerThread(Socket s) throws IOException { 
      socket = s; 
      in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
      OutputStreamWriter osw = new OutputStreamWriter(socket.getOutputStream()); 
      out = new PrintWriter(new BufferedWriter(osw), true); 
      start(); 
     } 
     public void run() { 
      try { 
       while (true) { 
        String str = in.readLine(); 
        textToSpeech.speak(str, TextToSpeech.QUEUE_FLUSH, null); 
       } 
      } catch (IOException e) {} 
      try { 
       socket.close(); 
      } catch(IOException e) {} 
     } 
    } 


} 



} 

Antwort

0

TextToSpeech Instanz verfügbar sein wird nach dem Systemdienst verbinden, nicht nach dem Konstruktor aufrufen.

So müssen Sie Ihren Plan wie folgt bearbeiten:

  1. Anruf TextToSpeech Konstruktor.

  2. Überprüfen Sie, ob Ihre TextToSpeech Instanz fertig ist, um eine Verbindung zum Systemdienst über TextToSpeech.OnInitListener.onInit() herzustellen.

  3. Verbinden Sie sich dann mit Ihrem benutzerdefinierten Dienst.

die Sie interessieren, wie unten:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    textToSpeech = new TextToSpeech(getApplicationContext(), new TextToSpeech.OnInitListener() { 
     @Override 
     public void onInit(int status) { 
      if(status != TextToSpeech.ERROR) { 
       int res = textToSpeech.setLanguage(Locale.ITALY); 
       if (res >= TextToSpeech.LANG_AVAILABLE) { 
        // TextToSpeech instance is available after connect to system service! 
        Thread socketT = new Thread(new SocketThread()); 
        socketT.start(); 
       } 
      } 
     } 
    }); 

    // At this time, your TextToSpeech instance may be not available yet. 
    //Thread socketT = new Thread(new SocketThread()); 
    //socketT.start(); 
} 
+0

Danke, ich werde versuchen, und ich werde euch wissen lassen. Aber das erklärt nicht, warum es anfänglich funktioniert und nach einigen Stunden nicht mehr funktioniert – mike5v

+0

Nun, ich stimme dem zu. Für eine genauere Analyse benötige ich Android-Debug-Protokolle. Könnten Sie den Logcat-Inhalt aktualisieren? – Kae10

+0

Leider besteht das Problem weiterhin. Wenn ich die Anwendung auf dem Emulator starten, funktioniert TTS immer, während auf einer Android-Box funktioniert es nach einer Weile, so kann ich ein Protokoll nicht abrufen, ich werde versuchen, eine App für die Protokolle zu installieren – mike5v

Verwandte Themen