Android:runOnUiThread并不总是选择正确的线程?

时间:2012-02-25 21:43:28

标签: java android multithreading

我有一个活动,一直在向用户读取文字,并使用onUtteranceCompleted with textTospeech在代码完成时显示内容。

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

2 个答案:

答案 0 :(得分:2)

我会使用Handler而不是runOnUiThread()。

首先,你正在使用一个启动另一个线程的线程 - 为什么?

其次,如果你创建一个简单的处理程序,它应该在旋转配置更改时自行终止。 IE:

private Handler handler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        // do your background or UI stuff
    }
};

然后使用Thread调用处理程序,这将启动你想在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();

答案 1 :(得分:0)

好的,这是我想出的一个解决方案,如果有人有更好的解决方案,我会聆听。

  1. 我在androidmanifest
  2. 中的活动中添加了android:configChanges="keyboardHidden|orientation" 2。

    然后是一个在旋转屏幕时调用的函数:

    @Override
    public void onConfigurationChanged(Configuration newConfig)
    {
      super.onConfigurationChanged(newConfig);
      setContentView(R.layout.streaming);
    
      initializeUI(); //contains all the findViewByID etc...
    }