我正在开发一个Android应用程序,其中我的SQLite数据库被Service和IntentService多次插入。
我在MainActivity中启动应用程序后立即启动我的服务。我的MainActivity几乎没有片段标签。其中一个片段在其Resume上激活IntentService。这意味着我的Service和IntentService可能同步运行。
Service和IntentService插入的数据可能相同。这种情况可能导致重复或异常。
我们可以假设Service和IntentService可以同时运行并在DataBase中产生不一致吗?
答案 0 :(得分:1)
如果您有Service
,那么当调用startService()
时,会导致调用onStartCommand()
,该调用会在此过程中的主(UI)线程上运行。
在IntentService
中,当调用startService()
时,会导致调用onHandleIntent()
,这是在工作线程上调用的。
显然,这两个呼叫都有可能并行发生。
有许多方法可以处理潜在的并行执行。以下是一些例子:
您可以在公共对象上同步数据库加载,以便两个线程无法同时加载数据库。每个线程都应该在加载之前检查数据是否已经加载,以防止重复。
要加载数据库,您可以将作业提交到队列(或将Runnable
提交到Handler
或类似内容。然后,您有一个单独的线程,使队列中的条目出列并连续运行(一个接一个)。在这种情况下,如果您的服务都将作业提交到队列,则一个将在另一个之前运行,并且它们不会并行运行。此外,您还应确保通过在再次加载数据之前检查数据是否已加载,或确保您只在队列中运行一个作业来防止重复。