我使用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秒。
有谁知道为什么会这样?
答案 0 :(得分:0)
处理程序在准时发射时并不完美。其他线程(如UI线程)可能优先。此外,Android还有处理Intent的开销。换句话说,由于来自OS的线程监视延迟,处理程序可能会在650ms触发,但随后需要处理intent,接收器实例化,意图处理等等。
您可能最好使用延迟数据发送意图,然后让服务设置队列并根据预期的延迟频繁轮询它。例如可能应该每隔50ms轮询一次预定500ms的事件,以查看延迟时间是否已经过期。虽然未来10,000ms的事件可以在5,000ms或9,000ms进行轮询,然后随着时间的推移增加轮询频率。