0

如果我有一个本地的Service并且在 中Service,我有这个功能:doHeavyThings(). 在我Activity与本地连接ServiceonServiceConnected(...),我应该调用mService.doHeavyThings()UI 线程吗?它会阻塞我的 UI 线程吗?谁能解释一下?提前致谢!

4

2 回答 2

3

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

如果它同步交付结果,则不得在 UI 线程上调用这些方法。尽管 UI 线程会简单地等待结果,而 Service 和 binder 线程执行实际工作,但您的 UI 仍然会被阻塞,因为 UI 线程会等待控制流。

所以使用 AsyncTask、HandlerThread 或 Thread。

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

于 2013-03-04T09:28:50.157 回答
3

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

如果你想知道结果,你必须自己实现它。例如,您可以将 a 传递MessangerService将用于从Service后面与调用者进行通信的对象。

下面的文章解释了如何使用一个Messangerin aService来提供双向通信:http: //developer.android.com/guide/components/bound-services.html

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



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

于 2013-03-04T09:29:38.637 回答