2013-06-23 12 views
6

W mojej aplikacji używam TTS. Mam 20 różnych czynności, które zmieniają się, gdy użytkownik przesuwa palcem w lewo lub w prawo. Zgodnie z tym działaniem mówi się tekstem. Wykonuję tts z osobnym wątkiem, a wybór działania odbywa się z głównym wątkiem. Ale problem jest bardzo powolny, interfejs użytkownika wydaje się być powolny. Kiedy przesuwaj palcem w lewo lub w prawo, gdy skończy się tts, wypowiadając tekst, aktywność zmienia się, co nie powinno się zdarzyć, ponieważ używam osobnego wątku dla tts. Oto kod:Interfejs użytkownika aplikacji Text To Speech jest wolny Android

TTS klasa:

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(); 
} 

Gest Reader Klasa: (oddzielna klasa)

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() wywoływana jest metoda, gdy jest zaznaczone, który został przesunięty, przesuń palcem w prawo lub w lewo.

UWAGA:

Przed dodaniem TTS w tej aplikacji, interfejs użytkownika został działa prawidłowo bez opóźnienia lub powolność. Po dodaniu TTS aplikacja stała się wolna. Jak mogę rozwiązać ten problem

Pozdrowienia

+0

Każdy organ tutaj, aby pomóc ??? – user2498079

Odpowiedz

6

miałem ten sam problem i chciał komentować widząc następujący błąd logcat ...skipped x many frames. The application may be doing too much work on its main thread.

Oczywiście byłem pewien TTS był wywołany z innego wątku I sprawdzone przy użyciu Thread.currentThread().getName() Ale okazało się jednak, że OnInit rzeczywiście nadal działa na głównym wątku i wygląda na to, że ustawienie języka jest kosztowną operacją. Szybka zmiana uruchomić zawartość onInit w nowym wątku UI i zamrażania/choreografa skarży zatrzymane:

@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

Zapomniałem wspomnieć, że możesz uzyskać błąd kodu, chyba że ustawisz status init jako ostateczny. – sham

+0

Dziękuję bardzo! Długo się tym zajmowałem. Inicjalizacja TTS zawsze zatrzymała mój ekran interfejsu użytkownika. Nigdy nie przyszło mi do głowy, że mogę zastąpić metodę OnInit i uruchomić ją w wątku. Myślę, że to tylko jedno funkcjonalne rozwiązanie dla TTS jest powolne i freezint głównego wątku UI! –

+1

Próbowałem tego rozwiązania, ale to nie zadziała w żadnym języku poza angielskim. To nie ustawi języka poprawnie – mobilepotato7

Powiązane problemy