等待 GPS 定位修复的最佳方式是啥?
Posted
技术标签:
【中文标题】等待 GPS 定位修复的最佳方式是啥?【英文标题】:What is the best way to wait for a GPS location fix?等待 GPS 定位修复的最佳方式是什么? 【发布时间】:2011-02-04 20:11:19 【问题描述】:使用我的 android 应用程序,当用户执行某个操作时,会启动一个后台服务,该服务会获取当前 GPS 位置并将其保存在数据库中,此外还会执行一些其他操作。在该服务中,我使用LocationManager
类中的requestLocationUpdates()
并等到我的LocationListener
(由服务实现)的onLocationChanged()
被触发。但是等待onLocationChanged
触发的最佳方法是什么?我应该简单地轮询一个变量并等到它被设置吗?有什么建议吗?
注意:由于其他一些问题,我不能简单地写入 onLocationChanged()
中的数据库。
编辑:为了澄清我的情况,我可以举一个类似于我的例子的例子:
假设用户按下一个按钮并触发一个方法myMethod
,它将返回一些对象。然后,在这个 myMethod 中,我将注册来自 GPS 的位置更新(使用requestLocationChanged
),此外还等待用户位置并将其用于某些事情。换句话说,myMethod
在位置存在之前无法返回。我不知道在这种情况下如何使用onLocationChanged
。
【问题讨论】:
【参考方案1】:设置位置后,会触发 onLocationChanged,因此您无需轮询任何变量。为什么不能在 onLocationChanged 中保存位置?
【讨论】:
可能是因为gps监听器在后台服务,而不是他的主进程。 当用户执行触发位置获取服务的操作时,我的应用程序应该在继续之前获取当前位置。假设用户按下一个按钮并触发 myMethod 方法,该方法将返回一些对象。然后,在这个 myMethod 中,我将注册来自 GPS 的位置更新(使用 requestLocationChanged),此外还等待用户位置并将其用于某些事情。换句话说,myMethod 不能在位置出现之前返回。我不知道在这种情况下如何使用 onLocationChanged。 所以您想在 myMethod 中停止执行,同时等待 gps 同步并为您提供位置?你不应该那样做。如果这是您需要做的,您应该显示一个进度对话框,当 onLocationChanged 被触发时该对话框将被关闭。然后也在 onLocationChanged 中完成 myMethod 需要对位置做的任何事情。【参考方案2】:我所做的是将主屏幕上的视图设置为不确定长度的进度条,设置 requestLocationUpdates() 并返回给用户。如果您需要在解决位置之前阻止用户,那么您可以在您的活动顶部打开一个对话框,该对话框没有控件和进度条视图。然后在您的 onLocationChanged 回调中,您可以关闭该对话框并继续您的业务。
编辑:我再次阅读了您的问题,我想我理解得更好。我的第一个建议是看看你是否可以取消你的后台服务。您不必担心应用程序在等待 GPS 锁定时变得无响应,因为 GPS API 是异步的。如果由于某种原因您不能,那么您将不得不查看消息传递 API,以允许您的后台服务在 GPS 数据可用时向您的主 Activity 发送消息。 See the Developers guide.
【讨论】:
【参考方案3】:我认为您应该使用等待/通知方法。你应该有一些锁定对象。您在方法中调用 lockObject.wait() 。然后在 onLocationChanged 中调用 lockObject.notify()。这样,在收到 onLocationChanged 之前,您的方法不会返回。
实际上,更好的解决方案是审查您的设计并在可能的情况下使您的方法异步。
【讨论】:
【参考方案4】:根据我对问题的理解和阅读 cmets,我建议您使用 LocationManager
类的 getLastKnownLocation()
获取初始位置。同时注册onLocationChanged
活动。现在你可以在这个事件处理函数中做任何你想做的事情,同时在前端进行。此外,如果您需要当前位置,您可能需要等待requestLocationUpdates()
回复。在您的应用程序准备某些任务时让用户等待可能不是一个好主意。根据其他人的建议,您可以在此处使用进度条。
【讨论】:
以上是关于等待 GPS 定位修复的最佳方式是啥?的主要内容,如果未能解决你的问题,请参考以下文章