2013-02-22 1 views
15

Я использую рутину requestSingleUpdate() для библиотеки android LocationManager с LocationListener. Функциональность, которую я пытаюсь реализовать, заключается в том, что пользователь может нажать кнопку, и приложение получит свое текущее местоположение и выполнит обратное геокодирование, чтобы получить приблизительный адрес.Установить тайм-аут для запроса androidSingleUpdate

Моя проблема в том, что в зависимости от ситуации в сети устройства получение исправления местоположения может занять много времени. Как я могу реализовать тайм-аут, который заставит мой запрос requestSingleUpdate() отказаться и сказать пользователю, чтобы узнать их собственный кровавый адрес?

мой код:

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

ответ

30

LocationManager не кажется, есть механизм тайм-аута. Но у LocationManager есть метод с именем removeUpdates(LocationListener listener), который вы можете использовать для отмены любых обратных вызовов по указанному LocationListener.

Таким образом, вы могли бы реализовать свой собственный тайм-аут с чем-то вроде следующего псевдокода:

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

Я не уверен, что произойдет, если вы звоните locationManager.removeUpdates(myListener)после вы получите Местоположение. Вы можете проверить это, прежде чем звонить removeUpdates. Или вы могли бы добавить что-то вроде этого к методу onLocationChanged в обратном вызове (и, возможно, с другими методами, а):

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

Кроме того, если вы не можете ссылаться на myRunnable по какой-то причине, вы можете использовать MyHandler. removeCallbacksAndMessages (NULL); вместо –