2012-02-25 6 views
0

私はユーザーに単語を読ませ続けるアクティビティを持っていて、コードが完了したら何かを表示するためにonTturnanceCompleted with textTospeechを使っています。Android:runOnUiThreadは常に正しいスレッドを選択するとは限りませんか?

インサイドonUtteranceCompleted私は2番目と機能を遅らせるために、このコードを持っている:それはうまく機能のよう

Runnable task = new Runnable() { 
    public void run() { 
     //runs on ui 
     runOnUiThread(new Runnable() { 
      public void run() { 
       readWord(); 
      } 
     }); 
    } 
}; 
worker.schedule(task, 1, TimeUnit.SECONDS); 

は、これがそうですが、私はそれが問題を引き起こしていると思います。 携帯電話の画面を回転させると(これで新しいアクティビティが開始されます) いくつかの単語がバックグラウンドで読み込まれるのを聞いています。私はこれがrunOnUiThread()のために、活動をバックグラウンドで続けることになると思います。

2つのアクティビティを実行しないようにするにはどうすればよいですか?私は奇妙なパッチをすると画面が回転するのを止める必要がないのが好きです!

はありがとう

EDIT:

public void readWord() { 
    if (this.readingOnPause) { 
     return; 
    } 

    txtCurrentWord.setText(currentItem[1]); 

    this.hashAudio.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID,"word"); 
    this.tts.setLanguage(Locale.US); 
    this.tts.speak(this.currentItem[1], TextToSpeech.QUEUE_FLUSH,this.hashAudio); 
} 

EDIT2:労働者の

インスタンス化:

private static final ScheduledExecutorService worker = Executors.newSingleThreadScheduledExecutor(); 
+0

があなたのreadWord()関数を示して.. – L7ColWinters

+0

労働者java.util.Timerの権利ですか? –

+0

は次のようにインスタンス化されます。private static final ScheduledExecutorService worker = Executors \t \t \t .newSingleThreadScheduledExecutor(); – xtrimsky

答えて

0

[OK]を、これは私が作ってみた修正プログラムがあるので、もし誰かがより良い解決策を持っている、私は聞いている。私が使用する

@Override 
public void onConfigurationChanged(Configuration newConfig) 
{ 
    super.onConfigurationChanged(newConfig); 
    setContentView(R.layout.streaming); 

    initializeUI(); //contains all the findViewByID etc... 
} 
2

:私はandroidmanifest 2.

し、画面が回転しているときに呼び出される関数の中で活動内部android:configChanges="keyboardHidden|orientation"を追加しました

  1. runOnUiThread()ではなくHandlerを使用します。

    もう1つのスレッドを開始するスレッドを使用しています。なぜですか?

    第2に、単純なハンドラを作成した場合、それは回転設定の変更で自身を強制終了します。 IE:

    private Handler handler = new Handler() { 
        @Override 
        public void handleMessage(Message msg) { 
         // do your background or UI stuff 
        } 
    }; 
    
    その後、後であなたがUIスレッド上で実行したいものは何でもプロセスキックオフなる、ハンドラを呼び出すためにスレッドを使用

    new Thread() { 
        @Override 
        public void run() { 
         long timestamp = System.currentTimeMillis(); 
         // thread blocks for your 1 second delay 
         while (System.currentTimeMillis() - timestamp <= 1000) { 
          // loop 
         } 
    
         handler.sendEmptyMessage(0); 
        } 
    }.start(); 
    
関連する問題