我知道这个问题之前被问过很多次。
我不想在Run()
方法中添加标记。因为该方法仍然运行并耗尽电池。
如何完全停止线程?!
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_layout);
AudioDispatcher dispatcher = AudioDispatcherFactory.fromDefaultMicrophone(22050,1024,0);
dispatcher.addAudioProcessor(new PitchProcessor(PitchEstimationAlgorithm.AMDF, 22050, 1024, new PitchDetectionHandler() {
@Override
public void handlePitch(PitchDetectionResult pitchDetectionResult,
AudioEvent audioEvent) {
final float pitchInHz = pitchDetectionResult.getPitch();
runOnUiThread(new Runnable() {
@Override
public void run() {
Log.i("" + pitchInHz);
}
});
}
}));
Thread thread = new Thread(dispatcher,"Audio Dispatcher");
thread.start();
}
答案 0 :(得分:1)
非常肯定这对你来说不再重要,但对于未来可能会使用TarsosDSP
且面临同样问题的人来说,最简单的方法就是建立全球dispatcher
dispatcher = AudioDispatcherFactory.fromDefaultMicrophone(22050,1024,0);
只需stop
Thread
即可:
dispatcher.stop();
答案 1 :(得分:0)
Thread myThread =....
myThread.stop();
免责声明:此方法已被弃用,因此我可能厌倦了使用它,但它确实是一种停止线程的野蛮方式。除此之外,使用易变的旗帜是我唯一的想法。
请注意,使用myThread.stop()方法将立即抛出必须捕获的ThreadDeath异常。它还将导致释放线程所需的所有锁。
编辑:您也可以从main方法调用Thread.interrupt()来设置内部中断状态标志。 (线程将使用Thread.interrupted()轮询该标志,如果线程被中断并清除状态标志,则该标志将返回true