0

我正在编写一个处理程序以运行固定量(30 秒)的时间。基于它更新计数器以绘制视图组件。

counterRunnable = new Runnable() {
            int currV = 0;

            public void run(){

                if(count >= 360) {
                    counterHandler.removeCallbacks(this);
                    onTimerComplete();
                } else {
                    count++;
                    counterHandler.postDelayed(this, 83); // (30/360) = ~83
                }
            }
        };

因为我正在运行它以延迟83ms 360 时间(83*360 = 29880ms ~30 秒),但它运行了~39 秒。如果我做错了任何建议。

分析: 我用Timer进行了同样的检查(以固定速率计划),它的性能比Handler.postDelay更好,但仍然有任何建议为什么 postDelay 在这里最差

4

1 回答 1

0

您可以检查答案并使用 AlarmManager 实现此行为。

正如您在文档中看到的那样,runnable 开始运行可能会有额外的延迟。您也可以从@CommonsWare查看此解释:

Android 不是实时操作系统。所有 postDelayed() 保证至少是指定的毫秒数。除此之外,主要取决于主应用程序线程正在做什么(如果您将其捆绑,它无法处理 Runnable),其次取决于设备上发生的其他事情(服务以后台优先级运行,因此获得的 CPU 更少时间比前景)。

编辑:请记住,Timer为要执行的代码创建一个新线程。所以它不依赖于主线程的工作量。您可以在此处查看有关此的讨论

于 2015-03-09T11:02:26.773 回答