onLocationChanged always returns I old location

You are getting old location because of this line

  location = mgr.getLastKnownLocation(best);

because if GPS is not enabled then it will show you the old location . So remove this code It will work like a champ You can also refer to this library

https://github.com/nagendraksrivastava/Android-Location-Tracking-Library

On the basis of your comments I have edited the answer Okay Let me explain line by line location = mgr.getLastKnownLocation(best); it will give you object of last know location then it will go inside if condition and it will call dumplocation and will get last location data and after that you called

mgr.requestLocationUpdates(LocationManager.GPS_PROVIDER,
                10 * 1000, 50, this);

but suppose GPS provider is disabled then it will not fetch new location so you will get old location only . So either you can change it like

if(locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER))
                   {
                    locationManager.requestSingleUpdate(LocationManager.GPS_PROVIDER,new NagendraSingleLocationListener(),null);
                   }
                   else
                   {
                       locationManager.requestSingleUpdate(LocationManager.NETWORK_PROVIDER,new NagendraSingleLocationListener(),null);
                   }