Отслеживание GPS каждые 2 минуты (requestLocationUpdates, Timer или Handler)

Я разрабатываю приложение, которое должно каждые 2 минуты сохранять данные о GPS-положении устройства.
Первой попыткой было использовать requestLocationUpdates:

locationManager = (LocationManager)context.getSystemService(Context.LOCATION_SERVICE);
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 120000L, 0f, this);

Для тестирования я использую Samsung Galaxy Mini (Android 2.3.5).
Если я провожу тест в режиме отладки с подключенным USB-кабелем, все работает идеально, каждые две минуты я получаю позицию .
Проблема когда отключаю USB и иду на улицу тестировать. Таким образом я получаю координаты GPS каждую секунду. Это слишком.
После долгого просмотра кода я решил использовать таймер:

new Timer().scheduleAtFixedRate(new TimerTask(){
    @Override
    public void run() {
        Location loc=getLastBestLocation(Activity.this);
        GpsStore.save(loc);
    }   
}, 120000L, 120000L);

Опять же, если тестировать приложение в режиме отладки с помощью USB-кабеля, все идет нормально.
Если я выхожу и пройду тест, если приложение находится на переднем плане, все идет хорошо, если приложение находится в фоновом режиме, TimerTask не запускается каждые 2 минуты он останавливается, и когда приложение возвращается на передний план, внезапно все время запускается TimerTask, который он выполнял нормально. Но все быстро, примерно за 1 секунду.

Опять же, после долгого просмотра моего кода, я решил использовать вместо Timer Handler:

        final Handler handler = new Handler();
        Runnable runnable = new Runnable() {
           public void run() {
                                    Location loc=getLastBestLocation(Activity.this);
                                    GpsStore.save(loc);

                handler.removeCallbacks(this);
                handler.postDelayed(this,120000L);
           }
        };
        handler.removeCallbacks(runnable);
        handler.postDelayed(runnable, 120000L);

Как всегда все отлично работает в режиме отладки с USB. Что происходит сейчас, когда я провожу тест на улице, так это то, что, когда приложение находится на переднем плане, обработчик не запускается ровно каждые 2 минуты, иногда делает это каждые 4 раза в 1, но когда приложение находится в фоновом режиме, в порядке Runnable using Обработчик не запускается каждые 2 минуты, никогда не запускается.

Я бы использовал только requestLocationUpdates, но он вызывается каждую секунду.
Мне нужна ваша помощь. Спасибо.


person viya    schedule 11.06.2012    source источник


Ответы (1)


Если вы посмотрите документацию для locationManager.requestLocationUpdates, вы увидите, что аргумент minTime используется только как подсказка. Настоящий LocationProvider может предоставлять обновления раньше, чем вы укажете. Я бы порекомендовал вам также установить значение minDistance. Установите не менее 100 метров.

person jsmith    schedule 11.06.2012
comment
Спасибо за ответ. Я знаю, что minTime это намек. Поэтому я пытался использовать Timer и Handler. Мне нужны координаты GPS с фиксированным временным интервалом. Этот интервал должен соблюдаться всегда. Где я написал, что интервал составляет 2 минуты, может быть, 30 минут, но важно то, что интервал выполняется точно. Должно быть невозможно, что иногда работает, а иногда нет. - person viya; 12.06.2012
comment
Я проделал аналогичную вещь, регистрируя позиции. Я просто использовал AlarmManager и отправил PendingIntent компоненту службы. Это происходит независимо от того, находится ли ваша деятельность на переднем плане или нет. - person jsmith; 12.06.2012
comment
поставьте этот комментарий как и ответьте. Таким образом, люди будут голосовать (или нет) за хороший ответ. Насчет AlarmManager, спасибо, попробую, что вы скажете. - person viya; 12.06.2012