0

嘿,我目前正在设计一个应用程序,其中一些代码每 200 毫秒执行一次。我用于此的线程看起来像这样(简化):

final Handler handler = new Handler();
    Runnable runnable = new Runnable() 
    {   public void run() 
        {
              handler.postDelayed(this, 200);
            switch (status){
    case 1: check(1);p2.setBackgroundColor(0x00000000); p1.setBackgroundColor(0xDDCC0000);  status = 2; break;
    case 2: check(2);p1.setBackgroundColor(0x00000000); p2.setBackgroundColor(0xAAAA0000);  status = 1; break;
            }
        }
    }; runnable.run();

check() 包含一些非 UI 代码行。

问题是,postDelayed-200-ms 开始,当队列完全执行而不是开始时,所以系统需要一直执行命令堆栈和堆栈,所以这些实际上是 ~210-230ms (取决于 CPU 负载)

然后我尝试在线程的开头获取系统日期并添加 200 毫秒,但这会导致其他一些“更严重”的错误。

我对超过 200ms 的延迟没有任何问题,我只是想让它运行稳定。

我希望你能理解我的问题并能给我一些建议。

编辑:我知道处理程序运行可接受(200 毫秒延迟 4 毫秒)。问题是我当时调用的方法。我将打开一个新问题

4

2 回答 2

0

您是否尝试使用Timers进行操作?一个基本的实现看起来像

new Timer().scheduleAtFixedRate(new TimerTask() {

    @Override
    public void run() {
    // TODO Auto-generated method stub

    }
}, 200, 200);

您也可以尝试使用警报服务。这应该会给你准确(或至少一致)的结果。

于 2013-07-26T11:00:50.457 回答
0

如果 check() 包含非 ui 代码行,那么您应该在单独的线程中运行它们。

底线是 UI 线程*真的很忙,因此,您可以要求它每 200 毫秒执行一次操作,但不能保证任何精度,因为设备正在尽最大努力执行各种其他操作。当您说“较重的问题”时,您的确切含义是什么?

我会尝试启动一个线程,然后每 200 毫秒记录一次,以查看设备是否愿意以您希望的速度准确地执行*任何事情。如果是这样,那么您可以向 UI 线程发送消息进行绘制,如果您发现它的绘制被延迟,那么您可能需要减少延迟以给 UI 线程时间来完成绘制?(显然这也是非常不精确的,并且会因设备而异)。

于 2013-07-26T10:46:35.193 回答