PostDelayed无法正常工作

时间:2014-02-05 20:13:52

标签: android postdelayed

我使用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秒。

有谁知道为什么会这样?

1 个答案:

答案 0 :(得分:0)

处理程序在准时发射时并不完美。其他线程(如UI线程)可能优先。此外,Android还有处理Intent的开销。换句话说,由于来自OS的线程监视延迟,处理程序可能会在650ms触发,但随后需要处理intent,接收器实例化,意图处理等等。

您可能最好使用延迟数据发送意图,然后让服务设置队列并根据预期的延迟频繁轮询它。例如可能应该每隔50ms轮询一次预定500ms的事件,以查看延迟时间是否已经过期。虽然未来10,000ms的事件可以在5,000ms或9,000ms进行轮询,然后随着时间的推移增加轮询频率。