ApplicationContextを渡すように言ってくれた人たちに感謝します。それは簡単なことでした...難しいのは、TextToSpeechオブジェクトがスレッドセーフであることが保証されているかどうかでした。
スレッドセーフなものを作成する方法を教えてくれた回答に感謝します/それがそうであると仮定しますが、質問はオブジェクトがすでにあるかどうかについてでした。おそらく、スレッドセーフの実装は問題ない、と言ったはずですが、わざわざする必要があるかどうかを知りたかったのです。そして、私は確信がない限りスレッドセーフを想定したくありません。
私は以下を実行しました、そしてそれはうまくいったようでした。したがって、Android SDK TTSはスレッドセーフであると思いますが、すべてのデバイスでこれを想定しても安全であるというドキュメントが見つからないため、当面はTTSインスタンスをラップします。
package com.example.testproject;
import java.util.Random;
import android.os.Bundle;
import android.app.Activity;
import android.speech.tts.TextToSpeech;
import android.speech.tts.TextToSpeech.OnInitListener;
public class TestActivity extends Activity implements OnInitListener {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
tts = new TextToSpeech(getApplicationContext(), this);
}
TextToSpeech tts = null;
@Override
public void onInit(int arg0) {
for (int i = 0; i < 100; ++i) {
class Irritate implements Runnable {
Irritate(int iIn) {
i = iIn;
}
@Override
public void run() {
Random r = new Random();
try {
Thread.sleep(r.nextInt(2000));
} catch (InterruptedException e) {
e.printStackTrace();
}
tts.speak(Integer.toString(i), TextToSpeech.QUEUE_ADD, null);
}
int i;
}
Thread t = new Thread(new Irritate(i));
t.start();
}
}
}