IntentService 和 Service 运行 可以同时开启吗?

Can IntentService and Service run on the same time?

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

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

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

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

如果您有一个 Service,那么当 startService() 被调用时,这会导致对 onStartCommand() 的调用,其中 运行 主要是(UI) 进程中的线程。

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

显然,这两个调用有可能同时发生。

有很多方法可以处理潜在的并行执行。这里有几个例子:

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

  2. 要加载数据库,您可以将作业提交到队列(或将 Runnable 提交到 Handler,或类似的东西)。然后你有一个单独的线程从队列中取出条目并 运行 连续地(一个接一个地)发送它们。在这种情况下,如果您的两个服务都将作业提交到队列,一个将 运行 先于另一个,并且它们不会 运行 并行。同样在这里,您应该通过在再次加载数据之前检查数据是否已经加载,或者确保队列中只有 运行 一项作业来确保防止重复。

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