每10分钟在后台执行一次数据库操作

问题描述:

我想每10分钟在后台执行一次数据库操作。什么是最好的方法?每10分钟在后台执行一次数据库操作

可能:

  • 主题:怎么样?
  • 服务:很复杂吗?
  • AsyncTasks:太长时间

我目前的做法:

CountDownTimer clearDBsCountDownTimer = new CountDownTimer(600000, 600000) { 
    @Override 
    public void onFinish() { 
     ClearDBs(); 
    } 
}; 

private void ClearDBs() { 
    // Clearing databases here 
    clearDBsCountDownTimer.start(); 
} 

但它不工作:我想是因为ClearDBs()方法等待CountDownTimer完成,对吧?

但是,如何正确地做到这一点:任何想法?

AlarmManager + IntentService是最干净的方法。

使用AlarmManager,您可以安排周期性的IntentServices。

IntentService是在后台线程(onHandleIntent()调用)中执行特定操作并死亡的服务。

他们是一个完美的组合,在后台执行定期作业。

检查例如this post

请注意这种操作,因为它们可能会导致电池电量耗尽(并且让用户生气)。

正如@Squonk建议的那样,您可以使用setRepeating(...)setInexactRepeating(...)安排定期事件。

如果要执行,只有当你的应用程序在前台这样的背景任务,你仍然可以取消事件调用manager.cancel()

+0

但我只希望应用程序运行时进行数据库操作。我该如何重复运行它? – felixd 2013-04-05 21:49:14

+0

已更新我的回复 – fedepaol 2013-04-05 21:54:50

+1

@fedepaol:“...您必须在onHandleIntent()调用中安排另一个事件。”当使用'AlarmManager'方法'setInexactRepeating(...)'或'setRepeating(...)'时,这是不必要的。 – Squonk 2013-04-05 22:03:32

创建bound service将是一个不错的主意。

而对于线程使用ScheduledExecutorService

+0

鉴于他只想在应用程序处于活动状态时执行后台作业,这是一种更好的方法,因为边界会导致服务自动启动/停止。他必须关心的唯一事情是在服务被解除绑定时停止线程。 +1为您的回复 – fedepaol 2013-04-05 22:07:28

+0

我完全同意你的观点,这就是我没有提出'TimerTask'的原因,当你尝试停止时,'scheduleAtFixed'特别不稳定,至少这是我找到几次的时候接着就,随即。另一方面'ExecutorService'提供了很多选项来检查和停止正在运行的线程。他只需要停止功能。 – minhaz 2013-04-05 22:20:48

+0

但是自从他的评论:-)我不知道。 IntentService + AlarmManager感觉更稳定,但我必须承认,启动/停止比有界服务更复杂。 – fedepaol 2013-04-05 22:22:52