我希望我的代码等待mGPS.GotLocaton为true(在触发onLocationChanged事件时设置)
public class GPSManager {
Context MyContext;
boolean GotLocation = false;
Location CurrentLocation;
LocationManager locationManager;
LocationListener locationlistener = new LocationListener() {
public void onLocationChanged(Location location) {
// Called when a new location is found by the network location provider.
GotLocation = true;
locationManager.removeUpdates(locationlistener);
}
public void onStatusChanged(String provider, int status, Bundle extras) {}
public void onProviderEnabled(String provider) {}
public void onProviderDisabled(String provider) {}
};
public GPSManager(Context context){
this.MyContext = context;
locationManager = (LocationManager) MyContext.getSystemService(Context.LOCATION_SERVICE);
}
public void GetCurrentLocation(){
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationlistener);
GotLocation = false;
}
}
被召唤:
myGPS.GetCurrentLocation();
do{
}while (!myGPS.GotLocation);
但它没有等待/循环 - 我错过了什么。
答案 0 :(得分:1)
可能因为您在添加LocationListener
时已经立即获得了位置响应。
那里有一些奇怪的代码。请考虑使用回调。
有关位置信息的更多信息,请参阅此Android开发人员博客条目:
http://android-developers.blogspot.co.uk/2011/06/deep-dive-into-location.html
或者甚至更好,使用这个解决所有问题的库:
答案 1 :(得分:0)
你在哪个线程中调用获取位置的循环?
如果它在主线程中,那是非常错误的,因为locationlistener只获取在该线程上运行的事件,但由于这个线程在循环中,它将永远不会到达那里,所以你处于无限循环中,这也是导致ANR约5秒左右。
locationlistener的工作方式是使用观察者设计模式 - 当它有东西给你时,它会。你不能一次又一次地问它。您可以使用的唯一类似内容是使用getLastKnownLocation获取其拥有的最后位置。