是一个while(true)循环比每隔X ms发布一个handler.postDelayed()更便宜

时间:2014-02-20 11:53:31

标签: android while-loop android-handler

我正在制作一个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的内部工作原理以及发布处理程序的成本是多么昂贵,所以我只是想确保我最终做正确的事情。此外,如果有更便宜的解决方案,我很高兴听到它

2 个答案:

答案 0 :(得分:0)

循环比处理程序便宜,但你必须在一个单独的线程中使用适当的睡眠调用来实现它,否则它将阻止你的应用程序主线程,使你的应用程序无响应。另外,它需要同步来访问共享对象。

Handler.postDelayed()函数需要一些CPU,但它有一个好处,即如果你使用它就不需要线程同步。

答案 1 :(得分:0)

我认为这取决于你想要做什么。 在循环中你还有什么想做的吗? 当循环运行时,您的应用程序无法执行任何其他操作。它只是循环而循环。

您可能想要某种按钮可以按下以停止收听。 您可能想要一些显示噪音或音频级别的图表。

为了让UI始终保持平稳运行,我建议采用处理程序方法。 然后,您的UI线程将永远不会受到音频处理正在发生的事情的困扰......

我不是一个如此深入的专家能够判断一个while()循环的价格便宜多少,但我认为它肯定更便宜 - 但你有上面提到的缺点。 从编程的角度来看,在处理多线程时使用处理程序也更复杂。你没有使用while()方法的多个线程。

但是,我建议在与UI线程分开的线程中进行音频处理。