Android Location Listener звонит очень часто

Я использую провайдера сетевого расположения. Мне нужно позвонитьonLocationChanged метод из моегоLocationListener только один раз в 1 час. Вот мой код:

MyLocationListener locationListener = new MyLocationListener();   
locationMangaer.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 3600000, 0,locationListener);

Но это не работает. мойonLocationChanged звонит очень часто.

Какие параметры я должен использовать?

Ответы на вопрос(1)

Решение Вопроса

LocationManager#requestLocationUpdates() документация:

До Jellybean параметр minTime был только hin, t, и некоторые реализации провайдеров местоположения игнорировали его. Начиная с Jellybean и для Android-совместимых устройств обязательно соблюдать параметры minTime и minDistance.

Однако вы можете использоватьrequestSingleUpdate() с лупером и обработчиком для запуска обновлений один раз в час.

прибавление
Для начала вы можете прочитать больше оLoopers и Handlers здесь.

Вы используете API 8, который является хорошим выбором, но это ограничивает методы LocationManager, которые мы можем вызывать, так как большинство из них были представлены в API 9. API 8 имеет только эти три метода:

requestLocationUpdates(String provider, long minTime, float minDistance, LocationListener listener)
requestLocationUpdates(String provider, long minTime, float minDistance, LocationListener listener, Looper looper)
requestLocationUpdates(String provider, long minTime, float minDistance, PendingIntent intent)

Давайте воспользуемся первым методом, он самый простой.

Первый, создайте свой LocationManager и LocationListener, как обычно, но вonLocationChanged() стоп запрашивая больше обновлений:

@Override
public void onLocationChanged(Location location) {
    mLocationManager.removeUpdates(mLocationListener);
    // Use this one location however you please
}

Во-вторых, создайте пару новых переменных класса:

private Handler mHandler = new Handler();
private Runnable onRequestLocation = new Runnable() {
    @Override
    public void run() {
        // Ask for a location
        mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, mLocationListener);
        // Run this again in an hour
        mHandler.postDelayed(onRequestLocation, DateUtils.HOUR_IN_MILLIS);
    }
};

Конечно, вы должны отключить все ваши обратные вызовы вonPause() и включите их снова вonResume() для предотвращения LocationManager тратить ресурсы, приобретая неиспользуемые обновления в фоновом режиме.

Более технический момент:
Если вас беспокоит блокировка потока пользовательского интерфейса с помощью LocationManager, вы можете использовать второйrequestLocationUpdates() метод для предоставления конкретного Looper из нового потока (скажем, HandlerThread).

 Victoria Seniuk26 окт. 2012 г., 22:57
спасибо ... Может быть, вы можете дать мне ссылку на пример Looper и Handler?
 Victoria Seniuk27 окт. 2012 г., 08:16
Я использую minSdkVersion = "8"
 Sam26 окт. 2012 г., 22:59
Во-первых, какой минимальный API вы используете? (8, 10, 16?)
 Victoria Seniuk27 окт. 2012 г., 21:10
Круто! Действительно спасибо !!!

Ваш ответ на вопрос