gpt4 book ai didi

android - IntentService 和 Service 可以同时运行吗?

转载 作者:行者123 更新时间:2023-11-29 01:08:46 26 4
gpt4 key购买 nike

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

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

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

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

最佳答案

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

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

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

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

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

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

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

关于android - IntentService 和 Service 可以同时运行吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44925417/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com