前几天写程序的时候碰到一个线程问题:当时在用讯飞合成语音,有很多按钮,每个按钮的点击都会播报一段自己合成的音频,当然音频的播报可能会需要几秒甚至更长的时间,有些语音还有语音停顿,语音停顿的方法时用我之前写的博客中的停顿方法。为了防止与主线程冲突,就得搞一个新的线程去让他播报这段语音,当我点击一个按钮的时候,语音还没播报完全我就点击另一个按钮,这个时候我想要的效果当然是取消第一个按钮的播放,让线程只进行第二次的播放,当时的想法是我找一个方法把第一个线程给终止了再新建一个线程来播报就好了,期间想了不少方法去解决,什么用handler.removecallbacks,用thread,interrupt,用asynctask.cancel都没有实现成功,至于为什么,尝试之后分析一下很容易就发现了,我们的线程才没有那么容易就被你主动的杀死,最后只能取巧,用其他的方法解决,实现同样的效果。好吧,说了这么多的废话,说下我的解决方法。直接上代码就一目了然了
public void startSpeaking(final String playText) {
final String[] speakTexts = playText.split("【停顿】");
// 进行语音合成.
currentThread = new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < speakTexts.length; i++) {
mTts.startSpeaking(speakTexts[i], TTSController.this);
while (true) {
if (!currentThread.getName().equals(Thread.currentThread().getName()))
return;
if (flag != 0) {
break;
}
}
flag = 0;
}
}
});
currentThread.start();
}
我的while和flag是为了让我的每一句语音都能够播报完全,你也可以搞个死循环,当耗时操作完成之后再放开
两个线程都在进行,然而我又干不掉第一个线程,我只想他执行我希望的线程,那我就把希望执行的线程取出来,当然就是最后一次创建的线程,然后在我的while循环中判断,你要不是目标线程,我虽然干不掉你,但是我能让你什么也别做,直接给我return,别往下走就好,惯性思维让我们很容易的想到不用就干掉它,但是当我们实在干不掉的时候,只能想想其他办法,我干不掉你,你也别给我惹事,自个儿在边上玩,别影响我的操作。