IntentService和Service可以同时运行吗?

时间:2017-07-05 11:49:56

标签: android sqlite android-service intentservice

我正在开发一个Android应用程序,其中我的SQLite数据库被Service和IntentService多次插入。

我在MainActivity中启动应用程序后立即启动我的服务。我的MainActivity几乎没有片段标签。其中一个片段在其Resume上激活IntentService。这意味着我的Service和IntentService可能同步运行。

Service和IntentService插入的数据可能相同。这种情况可能导致重复或异常。

我们可以假设Service和IntentService可以同时运行并在DataBase中产生不一致吗?

1 个答案:

答案 0 :(得分:1)

如果您有Service,那么当调用startService()时,会导致调用onStartCommand(),该调用会在此过程中的主(UI)线程上运行。

IntentService中,当调用startService()时,会导致调用onHandleIntent(),这是在工作线程上调用的。

显然,这两个呼叫都有可能并行发生。

有许多方法可以处理潜在的并行执行。以下是一些例子:

  1. 您可以在公共对象上同步数据库加载,以便两个线程无法同时加载数据库。每个线程都应该在加载之前检查数据是否已经加载,以防止重复。

  2. 要加载数据库,您可以将作业提交到队列(或将Runnable提交到Handler或类似内容。然后,您有一个单独的线程,使队列中的条目出列并连续运行(一个接一个)。在这种情况下,如果您的服务都将作业提交到队列,则一个将在另一个之前运行,并且它们不会并行运行。此外,您还应确保通过在再次加载数据之前检查数据是否已加载,或确保您只在队列中运行一个作业来防止重复。

  3. 在数据库中创建一个用作锁定机制的表,并且有一个列指示加载是否正在进行(这应该是一个不允许重复的主键列)。在开始加载数据之前,请在锁定表中插入一行。如果正在进行加载,则应该使用"重复键"。如果成功,请加载您的数据。完成后,从锁定表中删除该行。