【问题标题】:Can IntentService and Service run on the same time?IntentService 和 Service 可以同时运行吗?
【发布时间】:2017-07-05 11:49:55
【问题描述】:

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

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

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

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

【问题讨论】:

  • @Doe 这在技术上是不正确的。服务不在线程上运行。 Service 是一个类的实例。 Service 的方法在线程上运行。一些服务方法在主线程上运行,一些在工作(后台)线程上运行。您还可以创建管理自己的后台线程的服务。反驳您的说法的一个例子是 onCreate()onStartCommand()主线程 上的 IntentService 上被调用。 IntentService 中提供的唯一主线程上调用的方法是onHandleIntent()

标签: android sqlite android-service intentservice


【解决方案1】:

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

IntentService 中,当startService() 被调用时,这将导致对onHandleIntent() 的调用,该调用在工作线程上调用。

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-30
    • 2020-12-03
    • 2017-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多