2013-02-22 18 views
15

Sto utilizzando la routine requestSingleUpdate() reoutine della libreria Android LocationManager con un LocationListener. La funzionalità che sto cercando di implementare è che l'utente può premere un pulsante e l'app otterrà la sua posizione corrente ed eseguire il geocoding inverso per ottenere l'indirizzo approssimativo.Impostare un timeout per la richiesta AndroidSingleUpdate

Il mio problema è che, a seconda della situazione di rete del dispositivo, la correzione della posizione potrebbe richiedere molto tempo. Come posso implementare un timeout che farà sì che il mio 'requestSingleUpdate()' si arrenda e avvisare l'utente di scoprire il proprio maledetto indirizzo?

il mio codice:

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

risposta

30

LocationManager non sembrano avere un meccanismo di timeout. Ma LocationManager ha un metodo denominato removeUpdates(LocationListener listener) che è possibile utilizzare per annullare eventuali richiamate nello LocationListener specificato.

Quindi, è possibile implementare il proprio timeout con qualcosa come il seguente pseudo-codice:

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

Non sono sicuro che cosa succede se si chiama locationManager.removeUpdates(myListener)dopo si ottiene la posizione. Potresti volerlo controllare prima di chiamare lo removeUpdates. Oppure, si potrebbe aggiungere qualcosa di simile al metodo onLocationChanged nel callback (ed eventualmente agli altri metodi, come pure):

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

Inoltre, se non è possibile fare riferimento myRunnable per qualche motivo, è possibile utilizzare myHandler. removeCallbacksAndMessages (NULL); anziché –

Problemi correlati