2012-02-25 21 views
0

我有一個活動,不斷閱讀單詞給用戶,並使用onUtteranceComplete與textTospeech來顯示代碼完成時的東西。Android:runOnUiThread並不總是選擇正確的線程?

裏面onUtteranceCompleted我有這樣的代碼來延遲功能與第二:

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個活動運行?我寧願如果我不必停止旋轉屏幕做一些奇怪的補丁!

謝謝

編輯:

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 2012-02-25 21:46:05

+0

工人是一個java.util.Timer嗎? – 2012-02-25 21:51:00

+0

工作是這樣實例化的:private static final ScheduledExecutorService worker = Executors \t \t \t .newSingleThreadScheduledExecutor(); – xtrimsky 2012-02-25 22:01:54

回答

0

好了,所以這是一個修復我拿出,如果有人有更好的解決方案,我在聽。

  1. 我在androidmanifest
  2. 2.

,然後一個被稱爲當屏幕旋轉功能添加android:configChanges="keyboardHidden|orientation"活動中:

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

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

我會用一個Handler而不是runOnUiThread()。

首先,您正在使用啓動另一個線程的線程 - 爲什麼?其次,如果你創建了一個簡單的Handler,它應該在旋轉配置改變時自行終止。 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();