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

}

}

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();
}

相关内容

  • 没有找到相关文章

最新更新