2013-02-22 21 views
15

Używam reutynacji requestSingleUpdate() z biblioteki Android LocationManager z LocationListener. Funkcją, którą próbuję wdrożyć, jest to, że użytkownik może nacisnąć przycisk, a aplikacja uzyska aktualną lokalizację i wykona odwrotne geokodowanie, aby uzyskać przybliżony adres.Ustawianie limitu czasu dla żądania Android: SingleUpdate

Mój problem polega na tym, że w zależności od sytuacji w sieci urządzenia uzyskanie poprawki lokalizacji może zająć dużo czasu. Jak mogę zaimplementować limit czasu, który spowoduje, że mój "requestSingleUpdate()" zrezygnuje i powie użytkownikowi, aby znalazł swój własny zakrwawiony adres?

mój kod:

LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
Criteria criteria = new Criteria(); 
criteria.setAccuracy(Criteria.ACCURACY_FINE); 
criteria.setPowerRequirement(Criteria.POWER_HIGH); 

locationManager.requestSingleUpdate(criteria, new LocationListener(){ 

     @Override 
     public void onLocationChanged(Location location) { 
      // reverse geo-code location 

     } 

     @Override 
     public void onProviderDisabled(String provider) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void onProviderEnabled(String provider) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void onStatusChanged(String provider, int status, 
       Bundle extras) { 
      // TODO Auto-generated method stub 

     } 

    }, null); 

Odpowiedz

30

LocationManager nie wydaje się mieć mechanizm limitu czasu. Ale LocationManager ma metodę o nazwie removeUpdates(LocationListener listener), której można użyć do anulowania wywołań zwrotnych w określonym LocationListener.

Tak, można zaimplementować własną limitu czasu z czymś poniższym pseudo-kod:

final LocationManager locationManager 
     = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 

    // ... 

    final LocationListener myListener = new LocationListener() { 
     //... your LocationListener's methods, as above 
    } 

    Looper myLooper = Looper.myLooper(); 
    locationManager.requestSingleUpdate(criteria, myListener, myLooper); 
    final Handler myHandler = new Handler(myLooper); 
    myHandler.postDelayed(new Runnable() { 
     public void run() { 
      locationManager.removeUpdates(myListener); 
     } 
    }, MY_TIMEOUT_IN_MS); 

Nie jestem pewien, co się dzieje, jeśli zadzwonisz locationManager.removeUpdates(myListener)po masz gości. Możesz to sprawdzić, zanim zadzwonisz pod numer removeUpdates. Czy można dodać coś takiego sposobu onLocationChanged w zwrotnego (i ewentualnie do innych metod, jak również):

myHandler.removeCallbacks(myRunnable); // where myRunnable == the above Runnable 
+3

Dodatkowo, jeśli nie można odwołać myRunnable z jakiegoś powodu, można użyć myHandler. removeCallbacksAndMessages (null); zamiast –

Powiązane problemy