0

我使用 postDelayed 来延迟动态持续时间。我发现它不能正常工作。这是我的源代码。

public Runnable service = new Runnable() {
        public void run() {     
            endTimeHere = System.currentTimeMillis();
            Log.d("Time",(endTimeHere-startTimeHere)/1000);
            switch (step)
            {
                case 0: 
                    delay = 0;
                    step = 1;
                    break;
                case 1:
                    delay = 600;        //delay 10 min = 600 sec
                    step = 2;
                    break;

                case 2:     
                    delay = 1200;   //delay 20 min = 1200 sec
                    step = 3;
                    break;
                case 3:     
                    delay = 1800;   //delay 30 min = 1800 secs
                    step = 0;
                    break;
                default:
                    break;
            }
            startTimeHere = System.currentTimeMillis();
            handler.postDelayed(service, delay*1000);   
        }
    };

我在 BroadcastLintener 中启动和停止处理程序。

public Handler handler = new  Handler();    
private BroadcastReceiver screenReceiver = new BroadcastReceiver()
    {
        public void onReceive(Context context, Intent intent)
        {
            String action = intent.getAction();
            if(Intent.ACTION_SCREEN_ON.equals(action))
            {
                handler.removeCallbacks(service);
            }
            else if(Intent.ACTION_SCREEN_OFF.equals(action))
            {
                handler.post(service);
            }
        }
    }

我确定 postDelayed 已添加到队列中,因为返回值为 true。但是,我记录的持续时间与我设置的延迟值不匹配。例如,我设置延迟 = 600 秒,记录持续时间 = 958 秒。

有谁知道为什么会这样?

4

1 回答 1

0

处理程序在应该在什么时候触发并不完美。其他线程(如 UI 线程)可能具有优先权。此外,Android 有处理 Intent 的开销。换句话说,由于来自操作系统的线程监视延迟,处理程序可能会在 650 毫秒触发,但随后需要处理意图、实例化接收器、处理意图等。

您最好发送带有延迟数据的意图,然后让服务设置一个队列并根据预期的延迟频繁轮询它。例如,计划在未来 500 毫秒的事件可能应该每 50 毫秒轮询一次,以查看延迟时间是否已过期。而未来 10,000ms 的事件可以在 5,000ms 或 9,000ms 轮询,然后随着时间的临近增加轮询频率。

于 2014-02-05T20:23:17.277 回答