2017-05-22 8 views
2

ソケット接続からの文字列を読み取るアプリケーションを作成しようとしていますが、数時間後にアプリケーションは(例外なしで)通話を停止します。文字列を送信しているサーバーが送信後に応答エコーを検出し続けるため、アプリケーションがまだ実行中であると確信しています。TextToSpeechは数時間後に動作を停止します

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) {} 
     } 
    } 


} 



} 

答えて

0

TextToSpeechインスタンスは後にした後、コンストラクタを呼び出していない、システムサービスに接続できるようになります。

だから、あなたの計画は次のように編集する必要があります。

  1. コールTextToSpeechコンストラクタ。

  2. TextToSpeechのインスタンスが完了していることを確認し、TextToSpeech.OnInitListener.onInit()からシステムサービスに接続してください。

  3. 次に、カスタムサービスに接続します。

以下のようにこれを試してみてください:

@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

はありがとう、私がしようとすると私はあなたが知っているだろう。 しかし、これが最初に動作してから数時間後に動作を停止する理由は説明しません。 – mike5v

+0

これについて私は同意します。より正確な分析のために、私はAndroidのデバッグログを知る必要があります。 logcatの内容を更新できますか? – Kae10

+0

残念ながら、問題は解決しません。 エミュレータでアプリケーションを起動すると、ttsはいつも動作し、アンドロイドボックスでは動作しなくなりますので、ログを取得できません。ログ用のアプリケーションをインストールしようとします。 – mike5v

関連する問題