2017-07-05 28 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. 在数据库中创建一个表,被用作锁定机制,有一栏,指示载荷是否在进行中(这应该是一个主键列,允许无重复)。在开始加载数据之前,在锁定表中插入一行。如果有负载正在进行,则这会因“重复键”而失败。如果成功,请加载您的数据。完成后,从锁定表中删除该行。
相关问题