Android while(true)循环是否比每X毫秒发布一个handler.postDelayed()便宜

Android while(true)循环是否比每X毫秒发布一个handler.postDelayed()便宜,android,while-loop,android-handler,Android,While Loop,Android Handler,我正在制作一个android应用程序,在这个应用程序中,我需要监控麦克风的音量。如果我每50-100ms取一次声级值,我的逻辑就起作用了。在我看来…要监控这些值,我有两个选择 1) 半路 while(true){ //get sound levels and do my logic } 2) 一个处理器每隔50毫秒重新放置一次以检查声级 final Handler handler3=new Handler(); handler3.postDelayed(new Runnable(){

我正在制作一个android应用程序,在这个应用程序中,我需要监控麦克风的音量。如果我每50-100ms取一次声级值,我的逻辑就起作用了。在我看来…要监控这些值,我有两个选择

1) 半路

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的内部工作原理,也不知道发布处理程序的成本有多高,所以我只想确保最终我做了正确的事情。另外,如果有更便宜的解决方案,我很高兴听到它,循环比handler便宜得多,但是你必须在一个单独的线程中使用适当的睡眠调用来实现它,否则它将阻塞你的应用程序主线程,使你的应用程序没有响应。此外,访问共享对象还需要同步


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

我认为这取决于您想要做什么。 在循环过程中,您还想做什么? 循环运行时,您的应用程序无法执行其他操作。它只是一圈又一圈

你可能想有一个按钮,可以按下停止收听。 您可能需要一些图表来显示噪音或音频级别

为了保持UI始终平稳运行,我建议使用处理程序方法。 您的UI线程将永远不会被音频处理所发生的事情所困扰

我不是一个深谙此道的专家,无法判断while()循环便宜多少,但我认为它肯定更便宜——但您有上述缺点。 从编程的角度来看,处理程序也比多线程更复杂。使用while()方法没有多个线程


但是,我建议在独立于UI线程的线程中进行音频处理。

请不要将我的手机置于一个紧密的环路中。如果您有其他方法可以不断获得麦克风的准确度值,我很高兴听到!这就是问题的目的…改进我的代码循环是在后台的服务中完成的。它没有要阻止的UI。当然,用户可以随意停止它。而且它并不意味着要一直持续使用,而不是激活一段时间然后停用。但当然,如果它足够便宜,可以在不影响电池寿命的情况下长时间保持激活状态,那就更好了。这就是为什么我在这里问这个问题。然后使用循环。Handler确实需要一些时间。我在分析我的应用程序时看到了它,在使用列表中的位置很高,足以让我注意到:)我看到了..thnx的信息。仅就一般知识而言……您知道处理程序的费用是在创建和发布时还是在运行时产生的吗?不,实际的探查器条目是handler.postdayed()。因此,调用将runnable放入队列。我想runnable本身只有过程入口/出口点作为开销。循环是在后台的服务中完成的。它没有要阻止的UI。当然,用户可以随意停止它。而且它并不意味着要一直持续使用,而不是激活一段时间然后停用。但当然,如果它足够便宜,可以在不影响电池寿命的情况下长时间保持激活状态,那就更好了。这就是为什么我在这里问这个问题。