2017-07-05 51 views
1

我正在開發一個Android應用程序,我的SQLite數據庫被Service和IntentService多次插入。Can IntentService和Service可以同時運行嗎?

我開始我的服務應用程序在MainActivity開始之後。我的MainActivity幾乎沒有包含片段的選項卡。其中一個片段在其Resume上激活IntentService。這意味着我的Service和IntentService可能會同步運行。

由服務和IntentService插入的數據可以是相同的。這種情況可能會導致重複或異常。

我們可以假設,服務和IntentService可以在數據庫上同時運行併產生不一致?

+0

@Doe這不是技術上是正確的。服務不在線程上運行。 「服務」是一個類的實例。 「服務」的方法在線程上運行。一些服務方法在主線程上運行,一些在工作線程(後臺)線程上運行。您還可以創建管理自己的後臺線程的服務。反駁你的語句的一個例子是在**主線程**上的'IntentService'上調用'onCreate()'和'onStartCommand()'。在**主線程**上調用的** IntentService中提供的唯一方法是'onHandleIntent()'。 –

回答

1

如果您有Service,那麼當調用startService()時,會導致調用onStartCommand(),該調用在該進程中的主(UI)線程上運行。

IntentService中,當調用startService()時,將導致調用onHandleIntent(),該調用在工作線程上調用。

顯然存在這兩種調用將並行發生的可能性。

有很多方法可以處理潛在的並行執行。這裏有幾個例子:

  1. 您可以將常用的對象上同步數據庫負載,使兩個線程不能同時加載數據庫。每個線程都應該檢查數據是否在加載之前已經被加載以防止重複。

  2. 要加載數據庫,可以將作業提交到隊列(或將Runnable提交到Handler或類似內容)。然後您將擁有一個單獨的線程,使隊列中的條目出隊並連續運行(一個接一個地運行)。在這種情況下,如果您的兩個服務都將作業提交到隊列中,則會在另一個之前運行並且它們不會並行運行。在這裏你也應該確保你通過檢查數據是否已經在加載之前被加載,或者確保你只在隊列中運行一個作業來防止重複。

  3. 在數據庫中創建一個表,被用作鎖定機制,有一欄,指示載荷是否在進行中(這應該是一個主鍵列,允許無重複)。在開始加載數據之前,在鎖定表中插入一行。如果有負載正在進行,則這會因「重複鍵」而失敗。如果成功,請加載您的數據。完成後,從鎖定表中刪除該行。
相關問題