2013-06-23 6 views
6

In meiner App verwende ich TTS. Ich habe 20 verschiedene Aktivitäten, die geändert werden, wenn der Benutzer nach links oder rechts streicht. Entsprechend der Aktivität wird ein Text gesprochen. Ich führe tts mit separatem Thread aus und die Aktivitätsauswahl wird mit Hauptthread durchgeführt. Aber das Problem ist sehr langsam, die Benutzeroberfläche fühlt sich slugish an. Wenn ich nach links oder rechts wische, ändert sich die Aktivität, sobald der Text beendet ist, was nicht passieren sollte, weil ich einen separaten Thread für tts verwende. Hier ist der Code:Text To Speech App UI ist langsam Android

TTS Klasse:

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

Gesture Reader Klasse: (separate Klasse)

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() -Methode aufgerufen wird, wenn es aktiviert ist, Welcher Swipe gemacht wurde, swipe nach rechts oder links.

HINWEIS:

Vor tts in diesem App Zugabe wurde die Benutzeroberfläche ordnungsgemäß ohne Verzögerung oder Langsamkeit durchführen. Nachdem ich TTS hinzugefügt hatte, wurde die App langsam. Wie kann ich

Grüße

+0

Jede Stelle hier zu helfen ??? – user2498079

Antwort

6

Ich hatte das gleiche Problem dieses Problem lösen und war etwa beim Anblick der folgenden logcat Fehler war ich sicher, dass TTS ...skipped x many frames. The application may be doing too much work on its main thread.

Natürlich Kommentar wurde von einem anderen Thread aufgerufen wird, die ich überprüft mit Thread.currentThread().getName() Aber es stellt sich jedoch heraus, dass OnInit tatsächlich noch auf dem Haupt-Thread lief und es sieht aus wie die Einstellung der Sprache ist eine teure Operation. Eine schnelle Änderung Inhalt onInit in einem neuen Thread und der UI-Gefrier/Choreograph Reklamation gestoppt zu laufen:

@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

Vergessen zu erwähnen, dass Sie möglicherweise einen Codefehler erhalten, es sei denn, Sie setzen den Initialisierungsstatus auf final. – sham

+0

Vielen Dank! Ich habe lange Zeit damit verbracht. Die TTS-Initialisierung hat meinen UI-Bildschirm immer eingefroren. Es ist mir nie in den Sinn gekommen, dass ich OnInit-Methode überschreiben und in einem Thread ausführen könnte. Ich denke, das ist nur eine funktionale Lösung für TTS, die langsam ist und den Haupt-UI-Thread einfriert! –

+1

Ich habe diese Lösung ausprobiert, aber dies funktioniert nicht für jede Sprache außerhalb von Englisch. Es wird die Sprache nicht korrekt eingestellt – mobilepotato7