安卓同步连接服务

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被调用之前执行”。

然而,我已经意识到这一点,问题是是否有一种同步连接服务的方法。


可能是重复的问题:Android如何等待直到服务实际连接? - Sam
1个回答

6
阻塞Android的主线程是一个非常糟糕的想法。这将冻结整个手机用户界面。如果您想防止用户在绑定和连接成功之间执行任何操作,您可以弹出一个不可取消的对话框,但它只会出现几毫秒。如果您的用户界面对服务的存在有硬依赖关系,那么您应该重新设计以消除这种依赖。由于它们的设计和本质特点,服务是异步的(从用户界面来看)和短暂的。系统可能随时杀死它们以获得更多资源(尽管它可能不会这样做)。如果它是一个软依赖项(如音频流应用程序),您应该隐藏或更改用户界面元素,直到服务绑定完成。因此,即使您找到了同步绑定的方法,作为一名Android用户和开发人员,我请求您找到更好的方法。

4
我看到很多类似这样的评论,关于围绕绑定方式重新设计用户界面 - 显示进度对话框,禁用按钮等。这很合理,但也基于琐碎的例子(例如媒体播放器),在那里用户交互是唯一会导致您进行服务调用的事情。当然还有一些情况,在继续之前需要进行服务调用。 - spaaarky21

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接