我遇到了一个必须在服务中每隔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);
}
};
答案 0 :(得分:1)
可能是您的异步任务导致延迟。
只是一个注释,您的计划实施看起来有点奇怪。也许你应该尝试这样的事情,可以证明更有效。
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
,以便它可以从下一篇文章开始。