2013-02-22 4 views
15

Ich verwende die Routine requestSingleUpdate() -Routine der Android LocationManager-Bibliothek mit einer LocationListener. Die Funktionalität, die ich zu implementieren versuche ist, dass der Benutzer eine Taste drücken kann und die App ihren aktuellen Standort erhält und umgekehrte Geokodierung durchführt, um die ungefähre Adresse zu erhalten.Legen Sie eine Zeitüberschreitung für Android-AnfrageSingleUpdate

Mein Problem ist, dass abhängig von der Netzwerksituation des Geräts eine Standortbestimmung lange dauern kann. Wie kann ich eine Zeitüberschreitung implementieren, die mein 'requestSingleUpdate()' dazu bringt, aufzugeben und dem Benutzer zu sagen, dass er seine eigene blutige Adresse finden soll?

mein Code:

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

Antwort

30

LocationManager scheint nicht zu einem Timeout-Mechanismus zu haben. Aber LocationManager hat eine Methode mit dem Namen removeUpdates(LocationListener listener), die Sie verwenden können, um alle Rückrufe auf dem angegebenen LocationListener abzubrechen.

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

Ich bin nicht sicher, was passiert, wenn man locationManager.removeUpdates(myListener)nach rufen Sie die Lage erhalten:

So könnten Sie Ihre eigene Timeout mit so etwas wie die folgenden Pseudo-Code implementieren. Vielleicht möchten Sie dies überprüfen, bevor Sie removeUpdates anrufen.

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

Außerdem, wenn Sie nicht myRunnable aus irgendeinem Grunde verweisen können, können Sie myHandler verwenden: Oder könnten Sie so etwas wie dies die onLocationChanged Methode in Ihrer Callback (und möglicherweise auch zu den anderen Methoden als auch) hinzuzufügen. removeCallbacksAndMessages (null); stattdessen –