等待值设置为true

时间:2012-06-16 14:09:48

标签: android gps location wait android-location

我希望我的代码等待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);

但它没有等待/循环 - 我错过了什么。

2 个答案:

答案 0 :(得分:1)

可能因为您在添加LocationListener时已经立即获得了位置响应。

那里有一些奇怪的代码。请考虑使用回调。

有关位置信息的更多信息,请参阅此Android开发人员博客条目:

http://android-developers.blogspot.co.uk/2011/06/deep-dive-into-location.html

或者甚至更好,使用这个解决所有问题的库:

http://code.google.com/p/little-fluffy-location-library/

答案 1 :(得分:0)

你在哪个线程中调用获取位置的循环?

如果它在主线程中,那是非常错误的,因为locationlistener只获取在该线程上运行的事件,但由于这个线程在循环中,它将永远不会到达那里,所以你处于无限循环中,这也是导致ANR约5秒左右。

locationlistener的工作方式是使用观察者设计模式 - 当它有东西给你时,它会。你不能一次又一次地问它。您可以使用的唯一类似内容是使用getLastKnownLocation获取其拥有的最后位置。