确定在Android中有关于GPS的问题。有几天我尝试创建代码,每隔20秒检测一个位置(经度,纬度),然后它会将此信息发送到服务器。但这个问题与发送数据无关。
我有几个想法和建议,我已经阅读了一堆或教程如何在循环中创建拾取坐标:
activity
中,使用LocationListener
IntentService
BUT:
使用LocationListener
,我可以使用onLocationChanged()
方法获取坐标,问题是它是Activity
,所以我假设如果屏幕会停止收集坐标关闭或有人打电话。
使用IntentService
和locationManager.getLastKnownLocation(provider)
- 这看起来很棒,因为它在自己的线程中运行,但在循环中(必须在那里,因为我们想要在中选择坐标)间隔)此代码不起作用:
lat = location.getLatitude();
lon = location.getLongitude();
它只是第一次起作用,之后,坐标保持不变(我还尝试重新声明LocationManager
,它什么都没改变)。在我看来,获得坐标是不必要的复杂。
我的问题是:我错过了什么/我做错了吗?感谢您的帮助,我感谢您提供的所有有用建议。
答案 0 :(得分:2)
我建议使用Service而不是IntentService。完成onHandleIntent()
中的代码后,IntentServices立即退出,无论是否还有任何回调数据。即使在单独的线程上,创建循环以重复轮询getLastKnownLocation()
也是一种非常低效的获取位置更新的方法。更好的方法是将LocationListener传递给requestLocationUpdates()
,从而将CPU从阻塞循环的繁忙工作中解放出来。
请注意,默认情况下服务不在自己的线程上运行,您需要自己执行此操作。我建议使用HandlerThread,因为requestLocationUpdates()
需要Looper才能正常运行。
来自IntentService的文档:
IntentService是服务的基类,可根据需要处理异步请求(表示为Intents)。客户端通过startService(Intent)调用发送请求;服务根据需要启动,使用工作线程依次处理每个Intent,并在工作失败时自行停止。
来自Service的文件:
关于Service类的大多数混淆实际上都围绕着而不是:
- 服务不是一个单独的流程。 Service对象本身并不意味着它在自己的进程中运行;除非另有说明,否则它将在与其所属的应用程序相同的过程中运行。
- 服务不一个帖子。它本身不是从主线程开始工作的手段(以避免应用程序无响应错误)。
答案 1 :(得分:0)
我想我不太明白你在说什么。据我所知,Location Strategies文档和LocationListener文档都没有说明必须将其作为一种活动来实现。据我所知(实际上已经使用过它),LocationListener是异步的:它会不时地为您提供有关您的位置的新信息。这取决于你如何使用它。
我要做的是:在服务开始时创建一个LocationListener,并定期检查其信息是否已更改。我链接的第一个文档给出了一个很好的解释如何使用它。