我已经对此做了很多研究,但仍然不确定我是否可以同步连接到Android服务。 startService()和bindService()服务调用本质上是异步的,我正在尝试做的是使这种行为同步。
我尝试在一个从主线程启动的单独线程中编写startService(),bindService()和ServiceConnection对象初始化(包含onServiceConnected()等)。并且主线程等待直到在另一个线程上调用onServiceConnected()并且服务对象被初始化,但由于onServiceConnected()仅由主线程(http://developer.android.com/reference/android/content/ServiceConnection.html)调用,该线程由于等待调用而被阻塞,因此它形成一个死锁。
有人知道我的上述推理是否正确/不正确?有没有其他方法来实现同步行为?或者唯一的选择是在onServiceConnected()回调发生后调用服务函数吗?
编辑:(解释它不是其他问题的完全重复)
在另一个问题中,应用程序异步连接服务并期望它同步行为,因为它提到“通过添加各种Log.xx我发现if之后的代码(bindService(...))实际上去了在ServiceConnection.onServiceConnected被称为“。
之前但是,我已经意识到了这一点,而且问题在于是否有办法同步连接服务。
答案 0 :(得分:4)
阻止Android主线程的非常糟糕的想法。这将冻结整体手机的用户界面。
如果您试图阻止用户在启动绑定和连接成功之间做任何事情,您可能会抛出一个不可取消的对话框,但它只会持续几毫秒。
如果您的UI对存在的服务有很强的依赖性,那么您应该重新设计,所以不应该。根据他们的设计和性质,服务是异步的(来自UI)和瞬态。系统可以随时杀死它们以获得更多资源(尽管可能不会)。如果它是一个软依赖(如音频流应用程序),你应该隐藏/更改UI元素,直到服务绑定。
因此,即使您找到了进行同步绑定的方法,我也会将您视为Android用户和Android开发人员,请找到更好的方法。