每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()
创建bound service将是一个不错的主意。
而对于线程使用ScheduledExecutorService
鉴于他只想在应用程序处于活动状态时执行后台作业,这是一种更好的方法,因为边界会导致服务自动启动/停止。他必须关心的唯一事情是在服务被解除绑定时停止线程。 +1为您的回复 – fedepaol 2013-04-05 22:07:28
我完全同意你的观点,这就是我没有提出'TimerTask'的原因,当你尝试停止时,'scheduleAtFixed'特别不稳定,至少这是我找到几次的时候接着就,随即。另一方面'ExecutorService'提供了很多选项来检查和停止正在运行的线程。他只需要停止功能。 – minhaz 2013-04-05 22:20:48
但是自从他的评论:-)我不知道。 IntentService + AlarmManager感觉更稳定,但我必须承认,启动/停止比有界服务更复杂。 – fedepaol 2013-04-05 22:22:52
但我只希望应用程序运行时进行数据库操作。我该如何重复运行它? – felixd 2013-04-05 21:49:14
已更新我的回复 – fedepaol 2013-04-05 21:54:50
@fedepaol:“...您必须在onHandleIntent()调用中安排另一个事件。”当使用'AlarmManager'方法'setInexactRepeating(...)'或'setRepeating(...)'时,这是不必要的。 – Squonk 2013-04-05 22:03:32