Android : Location Update in Mapview takes to long even tough Location is found
I have a problem with my Location Listener in a MapView Application. Especially there is a Problem with the time, my actual Position will be painted on a Map.
I attached two listeners to my MapView. The first one waits for a signal from the Network and the second one from the GPS. At the beginning of the Listener Implementation I get the Last Known Location to reduce the Time while other providers search a position.
My LocationListner in the MapView is called as followed:
public void locationManager(){
mLocationUpdateHandlerGPS = new LocationUpdateHandler();
mLocationUpdateHandlerNetwork = new LocationUpdateHandler();
mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
//-------Check if Network is available-----
mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, mLocationUpdateHandlerNetwork);
//-------Check if GPS is available---------
mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 500, 1, mLocationUpdateHandlerGPS);
}
The LocationUpdateHandler.class where i implemented the Listener looks like this:
public class LocationUpdateHandler implements LocationListener {
@Override
public void onLocationChanged(Location location) {
location = mLocationManager开发者_JAVA技巧.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
int lat = (int) (location.getLatitude() * 1E6);
int lng = (int) (location.getLongitude() * 1E6);
//Log Actual Position
Log.v(TAG, "Actual Postion // Get Latitude: " + lat);
Log.v(TAG, "Actual Postion // Get Longitude: " + lng);
mMyLocationOverlay.enableMyLocation();
Log.v(TAG, "Enable Location returns: "+mMyLocationOverlay.enableMyLocation());
mMyLocationOverlay.runOnFirstFix(new Runnable() {
@Override
public void run() {
mMapView.getController().animateTo(
mMyLocationOverlay.getMyLocation());
}
});
}
}
After the Map starts i check the Log Output from the DDMS and can see that the Location is get in Time.
08-29 14:50:16.136: VERBOSE/GeoTagMapActivity(7300): Running Activity GeoTagMapActivity
08-29 14:50:20.691: VERBOSE/GeoTagMapActivity(7300): Enable Location returns: true
08-29 14:50:20.691: VERBOSE/GeoTagMapActivity(7300): Actual Postion // Get Latitude: *******
08-29 14:50:20.691: VERBOSE/GeoTagMapActivity(7300): Actual Postion // Get Longitude: *******
Nevertheless i takes another 2 - 5 minutes until the Position will drawn on the Map.
I have no idea where's the Problem. Thanks for your help!
MyLocationOverlay
is a helper class of Google Maps for Android. It does it's own location acquiring, more specifically it uses GPS to do it.
Since you call runOnFirstFix(runnable)
it waits to get a GPS fix before executing your code. This can sometimes (especially indoor) take minutes. Hence the delay. It's also entirely possible to acquire network-based location, but not GPS position (especially indoors), so in this case your code would never be executed (except if MyLocationOverlay
falls back to network provider after timeout - this isn't explained anywhere).
The position that you see in the logs are positions that you acquire via network location provider (wifi and cell network locations).
Just remove runOnFirstFix()
as @user370305 suggested in comments.
精彩评论