看起來您正在註冊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