2010-04-06 4 views
1

Я пытаюсь создать класс-оболочку для функциональности Text-To-Speech от Google Android. Однако у меня возникли проблемы с поиском способа приостановить работу системы до тех пор, пока функция onInit не завершится. Приложенное внизу - это то решение, которое я создал на основе того, что я нашел здесь: Android speech - how can you read text in Android?Создание конвертера текста в речь в Android

Однако это решение не работает. Любые мысли о том, почему это может не работать, или что было бы хорошей идеей, чтобы убедиться, что любые вызовы Speak() происходят после моего вызова onInit()?

общественного класса SpeechSynth реализует OnInitListener {

private TextToSpeech tts; 
static final int TTS_CHECK_CODE = 0; 
private int ready = 0; 
private ReentrantLock waitForInitLock = new ReentrantLock(); 

SpeechSynth(Activity screen) 
{ 
    ready = 0; 
    tts = new TextToSpeech(screen, this); 
    waitForInitLock.lock(); 

} 

public void onInit(int status) 
{ 
    if (status == TextToSpeech.SUCCESS) 
    { 
     ready = 1; 
    } 
    waitForInitLock.unlock(); 
} 

public int Speak(String text) 
{ 
    if(ready == 1) 
    { 
     tts.speak(text, TextToSpeech.QUEUE_ADD, null); 
     return 1; 
    } 
    else 
    { 
     return 0; 
    } 
} 

}

Я был в состоянии сделать это, так что я могу передать строку текста через конструктор, затем он играл в OnInit(). Тем не менее, мне бы очень хотелось избежать необходимости уничтожать и воссоздавать весь механизм преобразования текста в речь каждый раз, когда мне нужно, чтобы моя программа говорила что-то другое.

ответ

1

Я предлагаю вам полагаться на блокировку вместо готового состояния int. Вставить код следующим образом:

public int Speak(String text) 
{ 
     if (waitForInitLock.isLocked()) 
     { 
      try 
      { 
       waitForInitLock.tryLock(180, TimeUnit.SECONDS); 
      } 
      catch (InterruptedException e) 
      { 
       Log.e(D_LOG, "interruped"); 
      } 
      //unlock it here so that it is never locked again 
      waitForInitLock.unlock(); 
     } 

    if(ready == 1) 
    { 
     tts.speak(text, TextToSpeech.QUEUE_ADD, null); 
     return 1; 
    } 
    else 
    { 
     return 0; 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^