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

标签 android sqlite android-service intentservice

我正在开发一个 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/

相关文章:

android - Robospice - 在更改 Activity 时保持 spice 服务继续运行

android - IntentService 和 Service 有什么区别?

python - 将具有一些公共(public)字段的多个表组合成一个表

android - 如何将消息从 BroadcastReceiver 发送到 Activity 或 fragment

android - Oreo 无限后台服务,如 Messenger 或 Instagram

java - 将 Firebase 中的多个坐标添加到 ArrayList 中并创建折线

mysql - SQL查询:Having number=max(number) doesn't work

android - 简单的 OpenGL 引擎

java - 如何调试返回带有值但没有内容的字符串的 Java 字符串拆分?

java - 从 Web 服务检索数据时出现问题