0

好的,在android中有一个关于GPS的问题。几天我尝试创建代码,它会每 20 秒检测一次位置(经度、纬度),然后它将此信息发送到服务器。但这个问题与发送数据无关。

我有几个想法和建议,我已经阅读了一堆或教程如何在循环中创建拾取坐标:

  1. activity, 使用LocationListener
  2. IntentService

但是:使用LocationListener,我确实可以使用onLocationChanged()方法获取坐标,问题是它是一个Activity,所以我假设如果屏幕关闭或有人打电话,收集坐标将停止。

使用IntentServiceand locationManager.getLastKnownLocation(provider)- 这似乎很棒,因为它在它自己的线程中运行,但是在一个循环中(它必须在那里,因为我们想在间隔中选择坐标)这个代码不起作用:

      lat = location.getLatitude();
      lon = location.getLongitude();

它只在第一次工作,之后,坐标保持不变(我也尝试过重新声明LocationManager,它没有改变)。在我看来,获取坐标是不必要的复杂。

我的问题是:我错过了什么/我做错了吗?感谢您的帮助,我感谢每一个有用的建议。

4

2 回答 2

2

我建议使用服务而不是 IntentService。IntentServices 在完成代码后立即退出onHandleIntent(),无论是否有任何回调已经返回数据。同样创建一个循环来重复轮询getLastKnownLocation()是获取位置更新的一种非常低效的方法,即使在单独的线程上也是如此。更好的方法是将LocationListener传递给requestLocationUpdates(),从而将 CPU 从阻塞循环的繁忙工作中解放出来。

请注意,服务默认情况下不会在自己的线程上运行,您需要自己执行此操作。我建议使用HandlerThread因为requestLocationUpdates()需要 Looper 才能正常运行。


IntentService的文档中:

IntentService 是按需处理异步请求(表示为 Intent)的服务的基类。客户端通过 startService(Intent) 调用发送请求;该服务根据需要启动,使用工作线程依次处理每个 Intent,并在工作结束时自行停止。

Service的文档中:

关于 Service 类的大多数混淆实际上都围绕着它不是什么:

  • 服务不是一个单独的进程。Service 对象本身并不意味着它在自己的进程中运行;除非另有说明,否则它在与其所属的应用程序相同的进程中运行。
  • 服务不是线程。它本身并不是一种脱离主线程工作的方法(以避免应用程序无响应错误)。
于 2013-03-01T18:07:09.387 回答
0

我想我不太明白你在说什么。据我所知,Location Strategies文档和LocationListener文档都没有说明必须将其作为活动来实现。据我了解(并且实际上已经使用它),LocationListener 是异步的:它会不时为您提供有关您的位置的新信息。这取决于你如何使用它。

我要做的是:在服务开始时创建一个 LocationListener 并定期检查其信息是否已更改。我链接到的第一个文档很好地解释了如何使用它。

于 2013-03-01T18:06:24.780 回答