2012-02-25 5 views
0

나는 사용자에게 단어를 계속 읽는 활동을하고 있으며, 코드 완성시 뭔가를 표시하기 위해 textTospeech와 함께 onUtteranceCompleted를 사용합니다.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

+0

노동자 java.util.Timer 맞습니까? –

+0

은 다음과 같이 인스턴스화됩니다. private static final ScheduledExecutorService worker = Executors \t \t \t .newSingleThreadScheduledExecutor(); – xtrimsky

답변

0

확인이 내가 함께 왔어요 수정은 그래서, 만약 누군가 더 나은 해결책을 가지고 있습니다. 나는 듣고 있습니다.

  1. 그때 AndroidManifest를

화면이 회전 될 때 호출되는 함수에 활동 안에 android:configChanges="keyboardHidden|orientation"를 추가했습니다 :

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

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

가 나는를 사용합니다 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(); 
관련 문제