0

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);

しかし、それは待機/ループしません-何が欠けていますか。

4

2 に答える 2

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/

于 2012-06-16T14:31:06.227 に答える
0

どのスレッドで位置を取得するループを呼び出しますか?

それがメイン スレッドにある場合、locationlistener はこのスレッドで実行されるイベントのみを取得するため、非常に間違っていますが、このスレッドはループ内にあるため、そこに到達することはなく、無限ループに陥り、ANR の原因にもなります約5秒前後。

locationlistener が機能する方法は、observer デザイン パターンを使用することです。何かを提供する場合は、それが提供されます。単純に何度も尋ねることはできません。使用できる唯一の同様の方法は、 getLastKnownLocationを使用して、最後の場所を取得することです。

于 2012-06-16T15:41:56.690 に答える