感谢那些告诉我传递 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();
}
}
}