Установите тайм-аут для Android requestSingleUpdate
Я использую рутинную reoutine requestSingleUpdate () для android LocationManager библиотека LocationListener. Функциональность, которую я пытаюсь реализовать, заключается в том, что пользователь может нажать кнопку, и приложение получит свое текущее местоположение и выполнит обратное геокодирование, чтобы получить приблизительный адрес.
моя проблема заключается в том, что в зависимости от положения устройства, определить местоположения может занять длительное время. Как я могу реализовать тайм-аут, который заставит мой "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);
1 ответов
LocationManager, похоже, не имеет механизма тайм-аута. Но!--2--> есть метод с именем 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 
