8

私のアプリでは、TTS を使用しています。ユーザーが左または右にスワイプすると変更される 20 の異なるアクティビティがあります。アクティビティに従って、テキストが話されます。別のスレッドで tts を実行しており、アクティビティの選択はメイン スレッドで行われます。しかし、問題は非常に遅く、UI が鈍く感じます。左または右にスワイプすると、tts がテキストの読み上げを終了すると、tts に別のスレッドを使用しているため、アクティビティが変更されます。コードは次のとおりです。

TTS クラス:

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

ジェスチャー リーダー クラス: (別のクラス)

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
              }

右スワイプか左スワイプか、どちらのスワイプが行われたかがチェックされると、decisionActivity() メソッドが呼び出されます。

ノート:

このアプリに tts を追加する前は、UI は遅延や遅延なく適切に実行されていました。TTS を追加したら、アプリが遅くなりました。この問題を解決するにはどうすればよいですか

よろしく

4

1 に答える 1

8

私は同じ問題を抱えていて、次のlogcatエラーを見てコメントしようとしていました...skipped x many frames. The application may be doing too much work on its main thread.

もちろん、私が使用してチェックした別のスレッドからTTSが呼び出されているThread.currentThread().getName() ことOnInitは確かでしたが、実際にはまだメインスレッドで実行されており、言語の設定は高価な操作のようです. 新しいスレッドでコンテンツを実行するための簡単な変更onInitと、UI のフリーズ/コレオグラファーの不平が止まりました:

@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()
于 2014-06-25T00:21:36.523 に答える