【问题标题】:android connect to service synchronouslyandroid同步连接到服务
【发布时间】:2013-11-17 02:24:42
【问题描述】:

我对此做了很多研究,但仍然不确定我是否可以同步连接到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 multithreading android-service


【解决方案1】:

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

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

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

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

【讨论】:

  • 我见过很多这样的 cmets 围绕绑定的工作方式重新设计 UI - 显示进度对话框,禁用按钮等。这是合理的,但它也是基于琐碎的示例(例如,媒体玩家),其中用户交互是唯一会导致您拨打服务电话的事情。在某些情况下,需要在继续之前进行服务调用。
猜你喜欢
  • 1970-01-01
  • 2014-07-10
  • 2019-08-11
  • 2013-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-30
  • 2013-12-03
相关资源
最近更新 更多