Почему Android FusedLocationApi транслирует одно и то же местоположение в течение нескольких миллисекунд?

У меня есть приложение для Android, в котором я использовал FusedLocationApi для получения обновлений местоположения пользователя.

Ниже приведен сценарий: 1. У меня есть одноэлементный класс Watcher, в котором я определяю ожидающее намерение получить местоположения, даже когда приложение находится в фоновом режиме. Ниже приведен код:

    private PendingIntent pendingIntent;
    private Watcher() {
      Intent locationIntent = new Intent(context, Receiver.class);
      pendingIntent = PendingIntent.getBroadcast(
                    context, 007 /*requestcode*/, locationIntent,
      PendingIntent.FLAG_UPDATE_CURRENT);
   }

Затем, когда я успешно подключил службы определения местоположения, я запрашиваю обновления местоположения:

 LocationServices.FusedLocationApi.
                    requestLocationUpdates(googleApiClient, locationRequest, pendingIntent);

Теперь всякий раз, когда класс Receiver, который расширяет WakefulBroadcastReceiver, получает обновление местоположения, он запускает класс Service. Класс обслуживания расширяет IntentService. Ниже приведен код:

@Override
synchronized protected void onHandleIntent(final Intent intent) {
 if(LocationResult.hasResult(intent)) {
   LocationResult locationResult= LocationResult.extractResult(intent);
   Location location = locationResult.getLastLocation();
   printLocation(location);
 }

Итак, мой вопрос заключается в том, что, учитывая приведенные выше шаги, почему onHandleIntent пробуждается LocationReceiver несколько раз в течение 5 миллисекунд. Широта, долгота и точность одинаковы. Я определил

setFastestInterval(5 seconds); and
setInterval(1 minute);

Также точность определения местоположения составляет BALANCED_POWER_ACCURACY;

В моем приложении

LocationServices.FusedLocationApi.
                    requestLocationUpdates(googleApiClient, locationRequest, pendingIntent);

do вызывается несколько раз. Но согласно документации: «Любые ранее зарегистрированные запросы с одинаковым PendingIntent (как определено equals (Object)) будут заменены этим запросом». И я использую тот же объект pendingIntent для вызова requestLocationUpdates.

Заранее спасибо.


person Kanika    schedule 18.05.2017    source источник


Ответы (1)


Привет, Каника, вы можете установить минимальное смещение перед передачей объекта запроса местоположения, это поможет вам получать обновления только тогда, когда у вас есть определенное минимальное смещение. вы можете использовать метод ниже, чтобы сделать то же самое.

setSmallestDisplacement(float smallestDisplacementMeters)

Также справочная ссылка API для справки, https://developers.google.com/android/reference/com/google/android/gms/location/LocationRequest

person Alok    schedule 18.05.2017
comment
Эй, Алок, спасибо за ответ. Я попробовал это и все равно получил обновления через несколько миллисекунд: Вот журналы: 1) 05-17 21:33:04.654 2303-3697 Местоположение ключа изменено на: 37.37984540, -122.06425810 ; 2) 05-17 21:33:07.474 2303-3841/Расположение ключа изменено на: 37.37984000, -122.06452450 ; 3) 05-17 21:33:15.794 2303-3866/Расположение ключа изменено на: 37.37984000, -122.06452450 - person Kanika; 18.05.2017
comment
Попробуйте установить большее значение для смещения, скажем, 100 или 1000, и посмотрите, возникает ли у вас та же проблема? - person Alok; 18.05.2017
comment
Пробовал, все так же. Считаете ли вы, что pendingIntent не заменяется достаточно быстро. Потому что я вызываю requestLocationUpdates() несколько раз в течение нескольких миллисекунд? - person Kanika; 18.05.2017
comment
Не уверен, но если вы так считаете, пожалуйста, поделитесь еще немного кода, это может быть полезно. - person Alok; 18.05.2017
comment
Я думаю, вы можете удалить setFastestInterval (длинные миллисекунды). Скорее всего, это вызывает проблему. - person Alok; 18.05.2017