如果我有一个本地的Service
并且在 中Service
,我有这个功能:doHeavyThings()
. 在我Activity
与本地连接Service
后onServiceConnected(...)
,我应该调用mService.doHeavyThings()
UI 线程吗?它会阻塞我的 UI 线程吗?谁能解释一下?提前致谢!
2 回答
这取决于服务是异步(通过回调)还是同步传递结果。
如果它同步交付结果,则不得在 UI 线程上调用这些方法。尽管 UI 线程会简单地等待结果,而 Service 和 binder 线程执行实际工作,但您的 UI 仍然会被阻塞,因为 UI 线程会等待控制流。
所以使用 AsyncTask、HandlerThread 或 Thread。
如果服务异步传递其结果,您很可能可以从 UI 线程调用方法。
Service
默认情况下始终**在 UI 线程上运行。因此,为了避免 ANR,您的doHeavyThings()
方法应该只是开始一个新的方法Thread
,它可以完成所有繁重的工作。
如果你想知道结果,你必须自己实现它。例如,您可以将 a 传递Messanger
给Service
将用于从Service
后面与调用者进行通信的对象。
下面的文章解释了如何使用一个Messanger
in 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