我已经读过IntentService为要完成的工作创建工作线程。如果我理解正确,那么这意味着工作将在除UI线程之外的线程上完成。我的问题是
如果我的活动是尝试更新共享首选项,并且此intentService也更新共享首选项,那么这意味着我将遇到并发问题。正确?所以我更好地使用Service而不是IntentService,因为它在主UI线程上运行
请确认我的理解是否正确
答案 0 :(得分:2)
我已经读过IntentService为要完成的工作创建工作线程。如果我理解正确,那么这意味着工作将在UI线程以外的线程上完成。
正确。
如果我的活动是尝试更新共享首选项,并且此intentService也更新共享首选项,那么这意味着我将遇到并发问题。正确?
AFAIK,SharedPreferences
是线程安全的。因此,它将取决于这两个组件正在更新的内容。如果他们在单独的键下更新值,AFAIK你应该没问题。但是,如果它们可能正在修改相同键的值,那么您可能会遇到问题(脏读和诸如此类)。
所以我更好地使用Service而不是IntentService,因为它在主UI线程上运行
在Java中,对象不会在线程上“运行”。方法在线程上运行。因此,服务不会在“主UI线程”上运行。在主应用程序线程上调用所有服务的生命周期方法(例如,onCreate()
,onStartCommand()
)。这包括IntentService
。 IntentService
碰巧有onStartCommand()
的内置实现,可将Intent
路由到后台线程。
除此之外,不要在主应用程序线程上执行磁盘I / O,包括写入SharedPreferences
。
如果您可能从多个线程写入SharedPreferences
上的相同键,请使用并发编程技术。 Java线程已经和Java一样长,并且a lot written关于如何在Java中进行适当的并发编程。