我应该在UI线程中调用`Service`的函数吗?
如果我有一个本地Service
和在Service
,我有功能:doHeavyThings()
。在我连接Activity
与本地Service
在onServiceConnected(...)
后,我应该在UI线程中调用mService.doHeavyThings()
?它会阻止我的UI线程吗?任何人都可以解释它?提前致谢!我应该在UI线程中调用`Service`的函数吗?
A Service
总是
默认情况下**在UI线程上运行。 因此,为了避免ANR的doHeavyThings()
方法应该刚刚开始一个新的Thread
这是所有繁重的工作。
如果您想了解结果,您必须自行实施。例如,您可以将Messanger
传递给Service
,该号码将用于从Service
传回给呼叫者。
下面的文章介绍如何使用Messanger
在Service
提供双向通信: http://developer.android.com/guide/components/bound-services.html
另一种方法是使用IntentService
。你可以阅读更多关于它在这里: http://developer.android.com/reference/android/app/IntentService.html
** - 您可以使用android:process
属性,为<service>
声明AndroidManifest.xml
文件里在一个单独的进程中运行它。 (感谢级堆垛机)
它取决于服务是否异步(通过回调)或同步传递其结果。
如果它同步传递结果,则不能在UI线程上调用这些方法。尽管UI线程将简单地等待结果,而Service和绑定线程执行实际工作,但由于UI线程等待控制流的缘故,UI仍将被阻塞。
所以使用AsyncTask,HandlerThread或Thread。
如果服务异步传递其结果,那么很可能会从UI线程中调用方法。
只是一个说明。服务也可以在属于应用程序的进程的主(“UI”)线程上运行,但与活动的主UI线程运行的进程是分开的。当然,这要求IPC。 - 我对OP的理解是它是第三方服务。另外,我的理解是,这个问题只涉及援引这样的第三方服务。 – 2013-03-04 09:35:11
你是对的。感谢您指出了这一点。 – Paul 2013-03-04 09:36:29