TextToSpeech.OnInitListener.onInit(int), вызываемый непрерывно
Я получаю сообщения о том, что некоторые (не все) HTC Desire HD (FRF91, 2.2) и HTC EVO 4G (PC36100 | 3.29.651.5, 2.2), TextToSpeech.OnInitListener.onInit(int)
вызывается повторно (более 1500 раз в течение нескольких секунд) на том же объекте. Такое поведение не возникает ни для одного из моих других пользователей (или других пользователей Desire HD) AFAICT.
Код:
TextToSpeech tts = new TextToSpeech(context, new TextToSpeech.OnInitListener() {
private int mCallCount = 0; // trying to investigate potential infinite loops
@Override
public void onInit(int status) {
if ((mCallCount % 100) == 1) {
// report this
}
mCallCount++;
}
});
Любые идеи?
EDIT: Я также пробовал вызывать метод shutdown()
(впервые обнаружены вызовы нескольких прослушивателей), но это, похоже, не помогает.
Ответы
Ответ 1
Возможно, вам стоит обойти это с помощью собственного метода посредника, например:
private long lastCall = 0;
private long deepBreath = 5*1000; //5 seconds
private boolean hasRested;
TextToSpeech tts = new TextToSpeech(context, new TextToSpeech.OnInitListener() {
@Override
public void onInit(int status) {
long thisCall = Calendar.getInstance().getTimeInMillis();
intermediaryMethod(status, thisCall);
}
});
//new method
public void intermediaryMethod(int status, long thisCall) {
hasRested = (thisCall-lastCall)>=deepBreath;
if (hasRested) {
lastCall = thisCall;
//do something about 'status'
}
}
Ответ 2
Это может или не поможет, но у меня была аналогичная проблема при вызове tts из службы, к счастью для меня, мне было лучше делать мои tts из активности, которая решила проблему.
Если вы сделаете это, и это уместно, убедитесь, что ваш манифест для активности имеет:
android:finishOnTaskLaunch="true"
Ответ 3
Попробуйте создать объект Textospeech раньше, чтобы создать ie. глобально. Попробуйте этот код и проверьте, все ли он вызывает много раз????
public class TtsActivity extends Activity implements OnInitListener {
private int MY_DATA_CHECK_CODE = 0;
private TextToSpeech tts;
private EditText inputText;
private Button speakButton;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
inputText = (EditText) findViewById(R.id.input_text);
speakButton = (Button) findViewById(R.id.speak_button);
speakButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
String text = inputText.getText().toString();
if (text!=null && text.length()>0) {
Toast.makeText(TtsActivity.this, "Saying: " + text, Toast.LENGTH_LONG).show();
tts.speak(text, TextToSpeech.QUEUE_ADD, null);
}
}
});
Intent checkIntent = new Intent();
checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);
startActivityForResult(checkIntent, MY_DATA_CHECK_CODE);
}
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == MY_DATA_CHECK_CODE) {
if (resultCode == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS) {
// success, create the TTS instance
tts = new TextToSpeech(this, this);
}
else {
// missing data, install it
Intent installIntent = new Intent();
installIntent.setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);
startActivity(installIntent);
}
}
}
@Override
public void onInit(int status) {
if (status == TextToSpeech.SUCCESS) {
Toast.makeText(TtsActivity.this,
"Text-To-Speech engine is initialized", Toast.LENGTH_LONG).show();
}
else if (status == TextToSpeech.ERROR) {
Toast.makeText(TtsActivity.this,
"Error occurred while initializing Text-To-Speech engine", Toast.LENGTH_LONG).show();
}
}
}