我正在制作一个Android应用程序,我需要监听麦克风的声音级别。如果我每隔50-100ms取一个声级值,我的逻辑就有效。我看待它的方式......监控这些值我有两个选择
1)while循环
while(true){
//get sound levels and do my logic
}
2)一个处理程序,每次让我们自己重新发出50毫秒以检查声级
final Handler handler3=new Handler();
handler3.postDelayed(new Runnable(){
@Override
public void run() {
//get sound levels and do my logic
handler.postDelayed(this, 50);
}
}, 50);
使用处理程序解决方案对我来说似乎更便宜(在电池和CPU电源方面)。但我不太了解java和android的内部工作原理以及发布处理程序的成本是多么昂贵,所以我只是想确保我最终做正确的事情。此外,如果有更便宜的解决方案,我很高兴听到它
答案 0 :(得分:0)
循环比处理程序便宜,但你必须在一个单独的线程中使用适当的睡眠调用来实现它,否则它将阻止你的应用程序主线程,使你的应用程序无响应。另外,它需要同步来访问共享对象。
Handler.postDelayed()函数需要一些CPU,但它有一个好处,即如果你使用它就不需要线程同步。
答案 1 :(得分:0)
我认为这取决于你想要做什么。 在循环中你还有什么想做的吗? 当循环运行时,您的应用程序无法执行任何其他操作。它只是循环而循环。
您可能想要某种按钮可以按下以停止收听。 您可能想要一些显示噪音或音频级别的图表。
为了让UI始终保持平稳运行,我建议采用处理程序方法。 然后,您的UI线程将永远不会受到音频处理正在发生的事情的困扰......
我不是一个如此深入的专家能够判断一个while()循环的价格便宜多少,但我认为它肯定更便宜 - 但你有上面提到的缺点。 从编程的角度来看,在处理多线程时使用处理程序也更复杂。你没有使用while()方法的多个线程。
但是,我建议在与UI线程分开的线程中进行音频处理。