看起来您正在注册GPS和NETWORK提供程序以侦听10秒的位置,并且当计时器在10秒后熄灭时,您尝试从两个提供程序获取最新的位置。
这里有几件事情正在进行。
首先,您似乎正在侦听错误方法的更新。你的两个侦听器应该是这样的:
LocationListener locationListenerGps = new LocationListener() {
// This will never be called, its not part of the LocationListener interface - http://developer.android.com/reference/android/location/LocationListener.html
/* public void onStatusChanged(Location location) {
timer1.cancel();
locationResult.gotLocation(location);
lm.removeUpdates(this);
lm.removeUpdates(locationListenerNetwork);
} */
public void onProviderEnabled(String provider) {}
public void onProviderDisabled(String provider) {}
public void onLocationChanged(Location location) {
// This is the correct method to receive location callbacks
timer1.cancel();
locationResult.gotLocation(location);
lm.removeUpdates(this);
lm.removeUpdates(locationListenerNetwork);
}
public void onStatusChanged(String provider, int status, Bundle extras) {}
};
其次,我会用ScheduledThreadPoolExecutor或Handler代替Timer。
从Timer
文档:
体型的ScheduledThreadPoolExecutor对新代码......此类不提供有关任务调度的实时性保证。
如果需要重新启动才能使应用程序正常工作,则可能与定时器在10秒后未触发有关。请注意,这并不一定意味着GPS本身不工作。
Handler应该完成这项工作,它是为Android设计的,所以我建议使用它。它看起来像:
Handler handler = new Handler();
handler.postDelayed(getLastLocation, 10000);
...和你GetLastLocation
将变为:
Runnable getLastLocation = new Runnable() {
@Override
public void run() {
...
}
}
...和你cancel()
等方法将需要引用的处理程序。
另外,请注意,您正在使用提供程序类型NETWORK_PROVIDER在MainActivity中声明Location对象,然后在该对象中设置lat/long。
public Location mUserCoordinates = new Location(LocationManager.NETWORK_PROVIDER);
所以,在MainActivity位置类型将始终显示为的NETWORK_PROVIDER
,无论实际的源。
此外,看起来您的MainActivity不需要实现LocationListener,因为它从未在LocationManager中注册。
最后,而不是使用两个侦听器的GPS和网络,我会建议使用在谷歌融合的位置提供播放服务,为这里讨论: http://developer.android.com/training/location/receive-location-updates.html
你会被限制在设备Android 2.2及更高版本并安装了Google Play服务,但在我看来,这是值得的,以避免处理平台中某些偏僻的位置并管理多个提供商。有关融合位置服务提供商的更多信息,以及它如何与直接倾听GPS和NETWORK提供商的差异,请参阅此2013 Google I/O presentation - Beyond the Blue Dot: New Features in Android Location
我从来没有在使用gps的应用中看到过此行为。您需要提供更多信息。 – Christine
**“直到重新启动手机,GPS才能正常工作。”** - 我发现这很难相信。你的建议意味着*任何使用GPS的应用程序都需要在安装应用程序后重启设备。 – Squonk
@Christine由于重启后工作,我必须尝试找到一个设备,我可以重置每个调试周期以复制行为。今晚可能会有更新,并会随时更新。 – mattcoker