我有一个活动,一直在向用户读取文字,并使用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();
答案 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)
好的,这是我想出的一个解决方案,如果有人有更好的解决方案,我会聆听。
android:configChanges="keyboardHidden|orientation"
2。
醇>
然后是一个在旋转屏幕时调用的函数:
@Override
public void onConfigurationChanged(Configuration newConfig)
{
super.onConfigurationChanged(newConfig);
setContentView(R.layout.streaming);
initializeUI(); //contains all the findViewByID etc...
}