2010-04-06 2 views
1

Je tente de créer une classe wrapper pour la fonctionnalité Text-To-Speech de Google Android. Cependant, j'ai du mal à trouver un moyen de mettre le système en pause jusqu'à ce que la fonction onInit soit terminée. Ci-joint en bas est quelque chose d'une solution que j'ai créé sur la base de ce que j'ai trouvé ici: Android speech - how can you read text in Android?Création d'un wrapper de synthèse vocale dans Android

Cependant, cette solution ne semble pas fonctionner. Des réflexions sur les raisons pour lesquelles cela ne fonctionnerait pas, ou quelle serait une bonne idée pour s'assurer que tous les appels Speak() se produisent après mon appel onInit()?

SpeechSynth public class implémente 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; 
    } 
} 

}

Je suis en mesure de le faire pour que je puisse passer une chaîne de texte par le constructeur, alors qu'il a joué dans le onInit() fonction. Cependant, je voudrais vraiment éviter d'avoir à détruire et recréer l'ensemble du moteur de synthèse vocale à chaque fois que j'ai besoin que mon programme dise quelque chose de différent.

Répondre

1

Je vous suggère de compter sur le verrou au lieu de votre état prêt int. Insérer le code comme suit:

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; 
    } 
} 
Questions connexes