如何检查Handler是否有活动任务?

44

如果我有一个Handler handler = new Handler(),然后运行一个延迟任务handler.postDelayed(xxx, xxx),有可能检查postDelayed()是否被调用了吗?

5个回答

23

虽然没有直接的API可以实现这一点,但您可以通过使用sendEmptyMessage函数来绕过此问题。希望这能帮到您。

handler.sendEmptyMessage(some_integer);//Do this when you add the call back.
if(handler.hasMessages(some_integer))
handler.removeMessages(some_integer);//Do this after removing the call back.

我的代码中hasMessages()总是返回false。这个函数是否被确认可以正常工作? - pmont
是的,handler.sendEmptyMessage(1)会在处理程序中设置一个空消息,因此当您调用if(handler.hasMessages(1))时,它会返回true。如果您使用removeMessages(1)删除了该消息,则它将返回false。 - Triode
6
在我发出sendEmptyMessage(1)后,hasMessages(1)立即返回false。你是否在应用程序中使用过这段代码? - pmont
无法工作。对于任何阅读此内容的人:请改用布尔类型变量来实现此目的。 - DevilInDisguise

23

是否有可能检查postDelayed()方法是否被调用了?

一个快速的解决方案是,在方法中指定一个布尔类型变量来表示方法已被调用,然后进行检查。


不安全...如果有两个线程运行此处理程序,则可能无法正常工作 :) - Alireza Haji gholamreza

17

当提交一个Runnable时,Handler会获取标记为“what”字段等于0的Message。理论上,您可以调用hasMessages(0)方法,但您不能检查是否有待处理的Runnable——例如,当提交r0和r1时,您无法检查r0是否处于待处理状态。


这是聪明机智的想法!谢谢。 - Serg Burlaka

7

Handler.post()是一个方便的包装方法,它调用了sendMessageDelayed()。因此,如果您想检查handler是否有特定的待处理Runnable仍在运行,或者是否使用特定的Runnable调用了postDelayed(),那么请尝试使用以下类:

 public class HandlerWithID extends Handler {

    public final boolean postDelayed (int runnableID, long delayMillis, Runnable r) {
        Message m = Message.obtain(this, r);
        m.what = runnableID;
        return  sendMessageDelayed(m, delayMillis);
    }

    public final boolean post(int runnableID, Runnable r) {
        return postDelayed(runnableID, 0, r);
    } 

    public final boolean hasActiveRunnable(int runnableID) {
        return hasMessages(runnableID);
    }
}

0

步骤1: 首先,添加一个类变量 (不是局部变量

步骤2: 使用该变量检查处理程序是否正在运行。

    public MyClass{
    
    boolean isAlreadyDoing;
.
.
.
.
    
    if(!isAlreadyDoing){
        isAlreadyDoing=true;
        new Handler(Looper.myLooper()).postDelayed(() -> {
        isAlreadyDoing=false;
         //Do task here
        }, delaytTime);
      }
    }

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