gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 07:57:15 26 4
gpt4 key购买 nike

我有一个 Activity 不断向用户朗读单词,并使用 onUtteranceCompleted 和 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);

这看起来效果很好,但我认为它引起了问题。当我旋转手机屏幕时(我猜这会启动一个新 Activity )。我听到背景中有人念出一些文字。我猜这是因为 runOnUiThread() 使 Activity 在后台继续进行。

如何避免运行 2 个 Activity ?如果我不必在做一些奇怪的补丁时停止屏幕旋转,我会更喜欢!

谢谢

编辑:

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

编辑2:

worker 的实例化:

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

最佳答案

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

一方面,您使用的线程启动了另一个线程 - 为什么?

其次,如果您创建一个简单的处理程序,它应该在旋转配置更改时自行终止。 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();

关于java - Android:runOnUiThread并不总是选择正确的线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9448342/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com