5

我对此做了很多研究,但仍然不确定我是否可以同步连接到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 正在被调用”。

但是,我已经意识到这一点,问题是是否有办法与服务同步连接。

4

1 回答 1

5

阻止 Android 的主线程是一个非常糟糕的主意。这将冻结整个手机的用户界面。

如果你试图阻止用户在启动绑定和连接成功之间做任何事情,你可能会抛出一个不可取消的对话框,但它只会持续几毫秒。

如果你的 UI 对存在的 Service 有很强的依赖关系,那么你应该重新设计它。就其设计和性质而言,服务是异步的(来自 UI)和瞬态的。系统可以随时杀死它们以获得更多资源(尽管它可能不会)。如果它是软依赖(如音频流应用程序),您应该隐藏/更改 UI 元素,直到服务绑定。

所以即使你找到了一种同步绑定的方法,我要求你作为一个Android用户和Android开发者,请找到一个更好的方法。

于 2013-11-06T01:09:55.867 回答