等待GPS定位修复的最佳方法是什么?

5
使用我的Android应用程序时,当用户执行某个操作时,会启动一个后台服务,该服务会获取当前的GPS位置并将其保存到数据库中,同时还会执行其他一些操作。在该服务中,我使用LocationManager类的requestLocationUpdates()方法,并等待我的LocationListener(由服务实现)的onLocationChanged()方法被触发。但是,等待onLocationChanged()触发的最佳方式是什么?我应该简单地轮询一个变量并等待它被设置吗?有什么提示吗?
注意:由于其他一些事情,我无法简单地在onLocationChanged()中写入数据库。
编辑:为了澄清我的情况,我可以提供一个类似于我的情况的示例:假设用户按下一个按钮并且会触发一个名为myMethod的方法,该方法将返回某个对象。然后,在这个myMethod方法中,我会注册来自GPS的位置更新(使用requestLocationChanged),并且还会等待用户的位置并将其用于某些操作。换句话说,在位置可用之前,myMethod不能返回。我不知道在这种情况下如何使用onLocationChanged
4个回答

3

当位置设置后,onLocationChanged就会被触发,因此您不需要轮询任何变量。为什么不能在onLocationChanged中保存位置?


1
可能是因为 GPS 监听器在后台服务中而不是主进程中。 - Segfault
当用户执行触发位置获取服务的操作时,我的应用程序应该在继续之前获取当前位置。假设用户按下一个按钮并触发一个名为myMethod的方法,该方法将返回某个对象。然后,在这个myMethod中,我将注册GPS的位置更新(使用requestLocationChanged),并等待用户的位置并将其用于某些事情。换句话说,在位置存在之前,myMethod不能返回。我不知道如何在这种情况下使用onLocationChanged。 - qtips
1
所以你想在等待GPS同步并给出位置时停止myMethod的执行?你不应该这样做。如果这是你需要做的事情,你应该显示一个进度对话框,在onLocationChanged被触发时将其关闭。然后在onLocationChanged中完成myMethod需要使用位置完成的任何操作。 - Robby Pond

0
我所做的是在主屏幕上设置一个不确定长度的进度条视图,设置requestLocationUpdates()并立即返回给用户。如果您需要阻止用户直到位置解决,那么您可以在活动顶部打开一个没有控件和进度条视图的对话框。然后在您的onLocationChanged回调中,您可以关闭该对话框并继续处理业务。
编辑:我再次阅读了您的问题,我认为我更好地理解了。我的第一个建议是看看是否可以放弃后台服务。您不必担心应用程序在等待GPS锁定时变得无响应,因为GPS API是异步的。如果由于某种原因您不能这样做,则必须查看消息传递API,以允许您的后台服务在GPS数据可用时向主Activity发送消息。请参阅开发人员指南

0

我认为你应该使用wait/notify方法。你应该有一个锁对象。在你的方法中调用lockObject.wait()。在onLocationChanged中调用lockObject.notify()。这样,你的方法将不会返回,直到接收到onLocationChanged。

实际上,更好的解决方案是检查你的设计,并在可能的情况下使你的方法异步化。


0
根据我对问题的理解和阅读评论,我建议您使用LocationManager类的getLastKnownLocation()获取初始位置。还要注册onLocationChanged事件。现在,您可以在此事件处理程序函数中执行任何您想要的操作,同时继续在前端进行。此外,如果您需要当前位置,您可能需要等待requestLocationUpdates()响应。让用户在您的应用程序准备某些任务时等待可能不是一个好主意。正如其他人建议的那样,您可以在这里使用进度条。

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