如何更改/重置处理程序的延迟时间?

16

我正在使用HandlerpostDelayed方法,以便在一定时间后执行某个操作:

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,但它并不会把这个数值考虑在内,只是等待该时间,而不管将time_to_wait的值更改为任何其他值。


1
我认为你需要取消并重新发布可运行的任务。 - Kaediil
@Kaediil 在我的情况下这样做并不高效。 - Muhammed Refaat
int 是一种原始类型,传递的是值 - 值被复制,与原始变量没有任何关联。如果您将 int 变量传递给某个方法,然后尝试在其他地方更改该变量(在该方法之外),则该变量的更改不会反映在此方法中,因为它拥有自己的变量副本。 - Drew
1
@MuhammedRefaat 将你的 Runnable 存储为引用,声明为 Runnable r = new Runnable(...);。然后像这样发布它:handler.postDelayed(r, time_to_wait);。如果需要在此期间取消它,可以调用 handler.removeCallbacks(r);。根据您的应用程序逻辑,可以再次发布它。希望这有所帮助。 - Drew
1
@MuhammedRefaat 是的,你说得对 :) 我正在移除我的标记。 - Olga Konoreva
显示剩余3条评论
3个回答

31

通过轻松创建可由处理程序显示的可运行项,并将处理程序创建为静态成员,最后当您想要停止它时,只需删除所创建可运行项的回调函数;如果您想要重新启动它,您必须删除回调函数并重新分配它:

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);
}

使用removeCallbacks时,如果myRunnable没有在运行,会发生什么?应用程序会崩溃吗? - Mohamad Mousheimish
@MohamadMousheimish 我认为不会,因为如果可运行的内容没有运行,它什么也不会做。但我只是猜测,并不非常肯定,最好用try-catch块包围它或在运行之前进行检查。 - Muhammed Refaat

0

你可以试一试

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

每次需要发送新消息之前,都需要先删除旧消息。

0

KOTLIN版本:(Muhammed Refaat的答案):

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()
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接