Аналог setTimeout в Java

Рейтинг: 0Ответов: 2Опубликовано: 20.02.2015

Мой слушатель ChangeListener срабатывает за секунду кучу раз, а мне нужно из этой кучи только самое последнее его срабатывание (чтоб не плодить кучу запросов). Если бы я писал программу на JavaScript, то я бы каждое срабатывание обрабатывал функцией setTimeout с 1 секундой интервала, если бы за этим срабатыванием следовало следующее, то я бы отменял выполнение первого setTimeout и устанавливал новое, в итоге за секунду выполнялось бы только одно срабатывание. Как мне реализовать такое в Java?

Вот тут filtrRequestAdres(center); запускается кучу раз. Как в нем реализовать отфильтровывание срабатываний onCameraChange?

mMap.setOnCameraChangeListener(new OnCameraChangeListener() {

        @Override
        public void onCameraChange(CameraPosition pozCamera) {

                filtrRequestAdres(center);

        }

    });

public void filtrRequestAdres(LatLng center) {

       // if(...) {    startIntentService(); }

}

Как отложить выполнение функции в Java и как отменить отложенное выполнеиние функции? И чтоб на работу программы задержки не влияли. :)

Вот такая вещь почти решает мой вопрос:

new android.os.Handler().postDelayed(
new Runnable() {
    public void run() {
        Log.i("tag", "This'll run 300 milliseconds later");
    }
}, 300);

Она откладывает выполнение, но как отменить это отложенное выполнение?

Ответы

▲ 1

Можно обойтись и без хендлера. Все намного проще.

mMap.setOnCameraChangeListener(new OnCameraChangeListener() {
        long previousSystemTime = System.currentTimeMillis(); //Объявляем поле, которое будет хранить предыдущее время срабатывания

        @Override
        public void onCameraChange(CameraPosition pozCamera) {
                if((System.currentTimeMillis() - previousSystemTime) > 1000) { // если текущее время минус предыдущее больше 1000 миллисекунд
                    filtrRequestAdres(center); // то делаем, что надо
                    previousSystemTime = System.currentTimeMillis(); // и записываем новое значение предыдущего времени
                }

        }

    });
▲ 1

Есть метод setTimeout() в библиотеке underscore-java.

Пример с кодом:

final Integer[] counter = new Integer[] {0};
Supplier<Void> incr = new Supplier<Void>() {
    public Void get() {
        counter[0]++;
        return null;
    }
};
U.setTimeout(incr, 100);

Выполнение начнётся через 100 мс в новом потоке.