2012-06-16 95 views
0

我想我的代碼等待mGPS.GotLocaton爲真(時設置onLocationChanged事件被觸發)等待被設置爲true

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

看起來像Android代碼所以增加了Android標籤 –

回答

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/

+0

也他的代碼是髒的寫我不明白他爲什麼要在onLocationChanged中調用removeUpdates。 – Sajmon

+0

也不確定,但也許他只是想要一個位置更新。 –

+0

是的,也許是的。 – Sajmon

0

哪個線程可以稱爲獲取位置的循環?

如果它在主線程中,這是非常錯誤的,因爲locationlistener只能獲取在該線程上運行的事件,但由於該線程在循環中,因此它永遠不會到達那裏,因此您處於無限循環中,也會在大約5秒鐘左右導致ANR。

locationlistener的工作方式是使用觀察者設計模式 - 當它有東西給你,它會。你不能一次又一次地問它。您可以使用的唯一類似的事情是使用getLastKnownLocation獲取它的最後一個位置。