如果我有本地Service
并且在Service
,我有功能:doHeavyThings()
。在我将Activity
与Service
中的本地onServiceConnected(...)
相关联后,我应该在UI线程中调用mService.doHeavyThings()
吗?它会阻止我的UI线程吗?有谁能解释一下?提前谢谢!
答案 0 :(得分:3)
取决于服务是否异步(通过回调)或同步传递结果。
如果它同步传递结果,则不得在UI线程上调用这些方法。尽管UI线程只是等待结果,但是服务和绑定线程执行实际工作,您的UI仍将被阻止,因为UI线程等待控制流程。
所以使用AsyncTask,HandlerThread或Thread。
如果服务异步传递结果,您很可能会从UI线程调用方法。
答案 1 :(得分:3)
默认情况下,Service
总是 **在UI线程上运行。
因此,为了避免ANR,您的doHeavyThings()
方法应该只是开始一个新的Thread
来完成所有繁重的工作。
如果您想了解结果,您必须自己实施。例如,您可以将Messanger
传递给Service
,Service
将用于从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}}属性在单独的过程中运行它。 (谢谢类堆叠器)