flite という名前のサードパーティの tts を使用するアプリケーションを開発しています。ttsが文を話すように、私は何かをしています。話されている各単語を強調したいと思います。このために、tts から単語レベルのコールバックを取得することができました。ワークフローはこのようなものです--「テキストを話す」ボタンが押されました.tt s サービスを開始し、テキストを C 言語でアプリと結合された flite tts に送信します。ここで、C コードから、すべての単語の後に、2 つの異なる Java アクティビティへの 2 つのコールバックを作成します。テスト アクティビティで単語レベルのコールバックを正常に取得していますが、その後は UI 作業を行うことができません。
以下は、コールバックを取得したときに実行するコードです。これは、C コードから呼び出される関数です。
private void WordCallback(int isword) {// from
// callback
if (isword == -1) {
Log.d(LOG_TAG, "its not a word");
} else if (isword == -2) {
Log.d(LOG_TAG, "yeah..its the end");
} else {
Log.d(LOG_TAG, "its word no " + isword);
int word = isword;
Log.d(LOG_TAG, "highlightwords");
highlightwords(isword);
if (isword == 4) {
Log.d(LOG_TAG, "in if");
new Thread(new Runnable() {
@Override
public void run() {
Log.d(LOG_TAG, "thread started");
try {
Flitetest.this.runOnUiThread(new Runnable() {
@Override
public void run() {
Log.d(LOG_TAG, "run on ui");
textview.setText("#" + isword);
}
});
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
}
}
FliteTest はアクティビティの名前です。ログは「スレッドが開始されました」まで出力されますが、runonuithread() 内のコードは実行されず、エラーもありません。
また、textview.settext("something")
スレッドと runonuithread() なしで書き込むと、エラーが発生します。
fatal signal 11(sigsegv) at 0x6fc64e87(code=1), thread 20292(SynthThread)
.
その行動の理由は何ですか?