使用我的Android应用程序,当用户执行某项操作时,会启动后台服务,该服务会获取当前GPS位置并将其保存在数据库中,此外还会执行其他操作。在该服务中,我使用requestLocationUpdates()
类中的LocationManager
并等到onLocationChanged()
LocationListener
(由服务实现)被触发。但等待onLocationChanged
开火的最佳方式是什么?我应该简单地轮询一个变量并等到它被设置?有什么提示吗?
注意:由于其他一些原因,我不能简单地写入onLocationChanged()
中的数据库。
编辑:为了清除我的情况,我可以提供一个类似于我的案例:
假设用户按下一个按钮并触发一个方法myMethod
,它将返回一些对象。然后,在这个myMethod中,我将从GPS注册位置更新(使用requestLocationChanged
),另外等待用户位置并将其用于某些事情。换句话说,myMethod
在位置存在之前无法返回。在这种情况下,我不知道如何使用onLocationChanged
。
答案 0 :(得分:3)
设置位置后,会触发onLocationChanged,因此您无需轮询任何变量。为什么不能在onLocationChanged中保存位置?
答案 1 :(得分:0)
我所做的是将主屏幕上的视图设置为不确定长度的进度条,设置requestLocationUpdates()并返回给用户。如果您需要阻止用户,直到该位置得到解决,那么您可以在活动之上打开一个没有控件和进度条视图的对话框。然后在您的onLocationChanged回调中,您可以关闭该对话框并继续开展业务。
编辑:我再次阅读你的问题,我想我明白了。我的第一个建议是看你是否可以取消你的后台服务。您不必担心应用程序在等待GPS锁定时无响应,因为GPS API是异步的。如果由于某种原因你不能,那么你将不得不查看传递API的消息,以便后台服务在GPS数据可用时向您的主活动发送消息。 See the Developers guide答案 2 :(得分:0)
我认为你应该使用wait / notify方法。你应该有一些锁定对象。您在方法中调用lockObject.wait()。然后在onLocationChanged中调用lockObject.notify()。这样,在收到onLocationChanged之前,您的方法不会返回。
实际上,更好的解决方案是检查您的设计,并在可能的情况下使您的方法异步。
答案 3 :(得分:0)
根据我对问题的理解和阅读评论,我建议您使用getLastKnownLocation()
课程LocationManager
获取初始位置。同时注册onLocationChanged
事件。现在,您可以在前端执行时在此事件处理函数中执行任何操作。此外,如果您需要当前位置,则可能需要等待requestLocationUpdates()
回复。当您的应用程序准备某项任务时,让用户等待可能不是一个好主意。正如其他人所建议的那样,您可以在此处使用进度条。