Android 服务中每 X 秒处理一次
Android Handler every X seconds in Service
我有一个处理程序的问题,它必须在服务内每 X 秒执行一次。基本上计时一点都不精确,有时处理程序每 X 秒调用一次,然后 30 秒没有调用,然后在一秒内调用多次。
Handler handler = new Handler();
handler.postDelayed(runnable, 0);
private Runnable runnable = new Runnable() {
@Override
public void run() {
new postToCassandra().execute();
handler.postDelayed(this, CassandraPostBatch.TIME_INTERVAL);
}
};
可能是您的异步任务造成了延迟。
请注意,您的调度实现看起来有点奇怪。也许你应该试试这样的方法,可能会更有效。
private static final int TIMER_RATE = 30000;
private static final int TIMER_DELAY = 0;
private Timer timer;
private void startTimer() {
cancelTimer();
scheduleTimer();
}
private void scheduleTimer() {
timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
new postToCassandra().execute();
}
}, TIMER_DELAY, TIMER_RATE);
}
private void cancelTimer() {
if (timer != null)
timer.cancel();
}
然后直接调用 startTimer()
。您还可以在 PostToCassandra
任务中实现一个侦听器,它会在任务完成时通知 TimerTask
,以便它可以从下一个 post.
开始
我有一个处理程序的问题,它必须在服务内每 X 秒执行一次。基本上计时一点都不精确,有时处理程序每 X 秒调用一次,然后 30 秒没有调用,然后在一秒内调用多次。
Handler handler = new Handler();
handler.postDelayed(runnable, 0);
private Runnable runnable = new Runnable() {
@Override
public void run() {
new postToCassandra().execute();
handler.postDelayed(this, CassandraPostBatch.TIME_INTERVAL);
}
};
可能是您的异步任务造成了延迟。
请注意,您的调度实现看起来有点奇怪。也许你应该试试这样的方法,可能会更有效。
private static final int TIMER_RATE = 30000;
private static final int TIMER_DELAY = 0;
private Timer timer;
private void startTimer() {
cancelTimer();
scheduleTimer();
}
private void scheduleTimer() {
timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
new postToCassandra().execute();
}
}, TIMER_DELAY, TIMER_RATE);
}
private void cancelTimer() {
if (timer != null)
timer.cancel();
}
然后直接调用 startTimer()
。您还可以在 PostToCassandra
任务中实现一个侦听器,它会在任务完成时通知 TimerTask
,以便它可以从下一个 post.