2013-04-05 195 views
1

我想每10分鐘在後臺執行一次數據庫操作。什麼是最好的方法?每10分鐘在後臺執行一次數據庫操作

可能:

  • 主題:怎麼樣?
  • 服務:很複雜嗎?
  • AsyncTasks:太長時間

我目前的做法:

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

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

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

但是,如何正確地做到這一點:任何想法?

回答

2

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

2

創建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