我使用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会被添加到队列中,因为返回值为真。但是,我记录的时长与我设置的延迟值不匹配。例如,我设置了延迟= 600秒,记录的持续时间= 958秒。
有人知道为什么会这样吗?
发布于 2014-02-06 04:23:17
处理程序在应该触发的时候并不是完美的。其他线程(如UI线程)可能会优先使用。此外,Android有处理意图的开销。换言之,由于来自OS的线程监控中的延迟,处理程序可能在650ms处触发,但是随后需要处理意图、实例化接收器、处理意图等。
您最好发送带有延迟数据的意图,然后让服务设置一个队列,并根据预期的延迟频繁地轮询它。例如,安排在未来500ms的事件可能应该每50ms轮询一次,以查看延迟时间是否已过期。而将来10000ms的事件可以5000ms或9000ms轮询,然后随着时间的临近增加轮询频率。
https://stackoverflow.com/questions/21587498
复制相似问题