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

时间:2013-03-04 09:25:11

标签: android service

如果我有本地Service并且在Service,我有功能:doHeavyThings()。在我将ActivityService中的本地onServiceConnected(...)相关联后,我应该在UI线程中调用mService.doHeavyThings()吗?它会阻止我的UI线程吗?有谁能解释一下?提前谢谢!

2 个答案:

答案 0 :(得分:3)

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

如果它同步传递结果,则不得在UI线程上调用这些方法。尽管UI线程只是等待结果,但是服务和绑定线程执行实际工作,您的UI仍将被阻止,因为UI线程等待控制流程。

所以使用AsyncTask,HandlerThread或Thread。

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

答案 1 :(得分:3)

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

如果您想了解结果,您必须自己实施。例如,您可以将Messanger传递给ServiceService将用于从Messanger回传给来电者。

以下文章介绍了如何使用Service中的IntentService来提供双向通信: http://developer.android.com/guide/components/bound-services.html

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



** - 您可以使用<service>文件中AndroidManifest.xml声明中的{{1}}属性在单独的过程中运行它。 (谢谢类堆叠器)