我应该在UI线程中调用`Service`的函数吗?

问题描述:

如果我有一个本地Service和在Service,我有功能:doHeavyThings()。在我连接Activity与本地ServiceonServiceConnected(...)后,我应该在UI线程中调用mService.doHeavyThings()?它会阻止我的UI线程吗?任何人都可以解释它?提前致谢!我应该在UI线程中调用`Service`的函数吗?

A Service 总是 默认情况下**在UI线程上运行。 因此,为了避免ANR的doHeavyThings()方法应该刚刚开始一个新的Thread这是所有繁重的工作。

如果您想了解结果,您必须自行实施。例如,您可以将Messanger传递给Service,该号码将用于从Service传回给呼叫者。

下面的文章介绍如何使用MessangerService提供双向通信: http://developer.android.com/guide/components/bound-services.html

另一种方法是使用IntentService。你可以阅读更多关于它在这里: http://developer.android.com/reference/android/app/IntentService.html



** - 您可以使用android:process属性,为<service>声明AndroidManifest.xml文件里在一个单独的进程中运行它。 (感谢级堆垛机)

+2

只是一个说明。服务也可以在属于应用程序的进程的主(“UI”)线程上运行,但与活动的主UI线程运行的进程是分开的。当然,这要求IPC。 - 我对OP的理解是它是第三方服务。另外,我的理解是,这个问题只涉及援引这样的第三方服务。 – 2013-03-04 09:35:11

+0

你是对的。感谢您指出了这一点。 – Paul 2013-03-04 09:36:29

它取决于服务是否异步(通过回调)或同步传递其结果。

如果它同步传递结果,则不能在UI线程上调用这些方法。尽管UI线程将简单地等待结果,而Service和绑定线程执行实际工作,但由于UI线程等待控制流的缘故,UI仍将被阻塞。

所以使用AsyncTask,HandlerThread或Thread。

如果服务异步传递其结果,那么很可能会从UI线程中调用方法。