2013-06-23 4 views
6

Nella mia app sto usando TTS. Ho 20 diverse attività che vengono modificate quando l'utente fa scorrere verso sinistra o verso destra. Secondo l'attività, un testo è parlato. Sto eseguendo tts con thread separati e la selezione delle attività è fatta con thread principale. Ma il problema è molto lento, l'interfaccia utente è snella. Quando faccio scorrere verso sinistra o verso destra, una volta che tts ha terminato di pronunciare il testo, l'attività cambia che non dovrebbe accadere perché sto usando un thread separato per tts. ecco il codice:L'interfaccia utente di Text To Speech è lenta Android

TTS classe:

public class textToSpeech { 

TextToSpeech tts=null; 

public textToSpeech(Context con) 
{ 
    tts = new TextToSpeech(con,new TextToSpeech.OnInitListener() { 

     @Override 
     public void onInit(int status) { 

      if(status != TextToSpeech.ERROR) // initialization me error to nae ha 
      { 
       tts.setPitch(1.1f); // saw from internet 
       tts.setSpeechRate(0.4f); // f denotes float, it actually type casts 0.5 to float 
       tts.setLanguage(Locale.US); 
      } 

     } 
    }); 
} 

public void SpeakText (String text) 
{ 
    tts.speak(text, TextToSpeech.QUEUE_FLUSH, null); // TextToSpeech.QUEUE_FLUSH forces the app to stop all the sounds that are currently playing before speaking this text 
} 


public void stopSpeak() 
{ 
    tts.stop(); 
} 

Gesto Reader Classe: (classe separata)

public void decideAlphabet() 
{ 
    tts.stopSpeak(); 

    threadForTTS.start(); 

    switch (i) 
    { 
     case 0: 
      activities=null; 
      activities = new Intent(contxt,A.class); 
      contxt.startActivity(activities); 

      break; 

     case 1: 
      activities=null; 
      activities = new Intent(contxt,B.class); 
      contxt.startActivity(activities); 

      break; 
        ....... 20 more case statements for selecting activities 
       } 

decideActivity() metodo viene chiamato quando è selezionata, quale colpo è stato fatto, scorrere verso destra o sinistra.

NOTA:

Prima di aggiungere TTS in questa applicazione, l'interfaccia utente stava eseguendo correttamente senza lag o lentezza. Dopo aver aggiunto TTS, l'app è diventata lenta. Come posso risolvere questo problema

saluti

+0

Qualsiasi corpo qui per aiutare ??? – user2498079

risposta

6

Ho avuto lo stesso problema e stava per commentare vedere il seguente errore logcat ...skipped x many frames. The application may be doing too much work on its main thread.

Naturalmente ero sicuro TTS era stato chiamato da un altro thread che ho controllato usando Thread.currentThread().getName() Ma risulta comunque che OnInit era effettivamente ancora in esecuzione sul thread principale e sembra che impostare la lingua sia un'operazione costosa. Un rapido cambio di eseguire contenuti di onInit in un nuovo thread e l'interfaccia utente di congelamento/coreografo lamentati fermato:

@Override 
public void onInit(int status) { 
    new Thread(new Runnable() { 
     public void run() { 
     if(status != TextToSpeech.ERROR) // initialization me error to nae ha 
     { 
      tts.setPitch(1.1f); // saw from internet 
      tts.setSpeechRate(0.4f); // f denotes float, it actually type casts 0.5 to float 
      tts.setLanguage(Locale.US); 
     } 
     } 
    } 
}).start() 
+0

Hai dimenticato di menzionare che potresti ricevere un errore di codice a meno che non imposti lo stato di init sul finale. – sham

+0

Grazie mille! Sono stato in difficoltà con questo per un lungo periodo. L'inizializzazione TTS ha sempre congelato la schermata dell'interfaccia utente. Non mi è mai passato per la mente che potevo sovrascrivere il metodo onInit ed eseguirlo in una discussione. Penso che questa sia solo una soluzione funzionale per TTS che è lenta e freezint il thread principale dell'interfaccia utente! –

+1

Ho provato questa soluzione, ma questo non funzionerà in nessuna lingua al di fuori dell'inglese. Non imposterà correttamente la lingua – mobilepotato7