Как изменить/сбросить время задержки публикации обработчика?

Я использую метод postDelayed из Handler для выполнения действия через определенное время:

private static int time_to_wait = 2000;

Handler handler = new Handler();
handler.postDelayed(new Runnable() {
  public void run() {
    // Make Action
  }
}, time_to_wait);

теперь в середине времени ожидания я хочу изменить значение оставшихся миллисекунд из-за некоторых результатов обработки, скажем, теперь он ждал 1000 мс, и я хочу, чтобы он начинал отсчет с 2000 снова. Итак, я установил значение time_to_wait равным 2000, но оно не учитывает это, так как принимает только значение переменной (2000) и просто ждет это время независимо от изменения значение time_to_wait на любое другое значение.


person Muhammed Refaat    schedule 03.04.2014    source источник
comment
Я считаю, что вам нужно отменить и повторно опубликовать исполняемый файл. [StackOverflow][1] [1]: stackoverflow.com /вопросы/7407242/   -  person Kaediil    schedule 03.04.2014
comment
@Kaediil, в моем случае это не будет так эффективно   -  person Muhammed Refaat    schedule 03.04.2014
comment
int является примитивным типом и передается по значению - значение копируется и никак не связано с исходной примитивной переменной. Если вы передадите переменную int какому-то методу, а затем попытаетесь изменить эту переменную где-то еще (вне этого метода), изменения в переменной не будут отражены в этом методе, так как он имеет собственную копию переменной   -  person Drew    schedule 03.04.2014
comment
@ Хорошо нарисовал, отлично, теперь, если я хочу сделать то, что я объяснил, у тебя есть идеи, как это сделать?   -  person Muhammed Refaat    schedule 06.04.2014
comment
@MuhammedRefaat хранит ссылку на ваш Runnable, объявляя его как Runnable r = new Runnable(...);. Вы опубликуете это как: handler.postDelayed(r, time_to_wait);. Тем временем вы можете отменить его, позвонив по номеру handler.removeCallbacks(r);. А затем опубликуйте его снова, в зависимости от логики вашего приложения. Надеюсь, это поможет.   -  person Drew    schedule 07.04.2014
comment
Этот ответ может быть вам полезен.   -  person Olga Konoreva    schedule 27.08.2018
comment
@OlgaKonoreva, да, это та же техника, которую я использовал в ответе здесь, что-то еще, я считаю, что вопрос, который вы упомянули как мой, является дубликатом, должен быть тем, который является дубликатом для моего, поскольку его задавали после моего более трех лет. :D   -  person Muhammed Refaat    schedule 27.08.2018
comment
@MuhammedRefaat Да, вы правы :) Я снимаю свой флаг.   -  person Olga Konoreva    schedule 28.08.2018


Ответы (3)


этого можно достичь, легко создав исполняемый файл, который будет отображаться обработчиком, затем создав обработчик как статический член, наконец, когда вы хотите остановить его, просто удалите обратный вызов созданного исполняемого файла, и если вы хотите перезапустить его, у вас есть чтобы удалить обратный вызов и назначить его снова:

Runnable myRunnable = new Runnable() {
    @Override
    public void run() {
        // your code here
    }
};

public static Handler myHandler = new Handler();
private static final int TIME_TO_WAIT = 2000;

public void start() {
    myHandler.postDelayed(myRunnable, TIME_TO_WAIT);
}

public void stop() {
    myHandler.removeCallbacks(myRunnable);
}

public void restart() {
    myHandler.removeCallbacks(myRunnable);
    myHandler.postDelayed(myRunnable, TIME_TO_WAIT);
}
person Muhammed Refaat    schedule 01.08.2016
comment
при использовании removeCallbacks что произойдет, если myRunnable не запущен. Вылетит ли приложение? - person Mohamad Mousheimish; 17.04.2020
comment
@MohamadMousheimish Я думаю, что нет, так как если runnable не запущен, он ничего не сделает, но я просто предполагаю, и я не совсем уверен в этом, лучше окружить его блоком try-catch или сделать проверку перед запустить его - person Muhammed Refaat; 19.04.2020

ты можешь просто попробовать

handler.removeMessage(what)
handler.sendMessageDelayed(time_to_wait + INTERVER);

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

person whb_zju    schedule 03.04.2014

ВЕРСИЯ КОТЛИНА: (Ответ #Мухаммеда Рефаата):

var myHandler = Handler()
private val TIME_TO_WAIT: Long = 2000

var myRunnable = Runnable {
    // your code here
}

fun start() {
    myHandler.postDelayed(myRunnable, TIME_TO_WAIT)
}

fun stop() {
    myHandler.removeCallbacks(myRunnable)
}

fun restart() {
    stop()
    start()
}
person Muhammed Irfan    schedule 04.05.2020