我对此进行了大量研究,但仍不确定是否可以同步连接到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正在被调用”。
但是,我已经意识到了这一点,问题在于是否有一种方法可以与服务同步连接。
阻止Android主线程是一个非常糟糕的主意。这将冻结整个手机的UI。
如果您试图阻止用户在开始绑定和连接成功之间执行任何操作,则可能会抛出一个不可取消的对话框,但这只会持续几毫秒。
如果您的UI对存在的服务有严格的依赖性,那么,您应该重新设计,而不是重新设计。根据其设计和性质,服务是异步的(来自UI)和瞬时的。该系统可以随时杀死它们以获取更多资源(尽管可能不会)。如果是软依赖性(例如音频流应用程序),则应仅隐藏/更改UI元素,直到服务绑定为止。
因此,即使您找到一种进行同步绑定的方法,也请您作为Android用户和Android开发人员,请找到一种更好的方法。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句