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

时间:2013-04-18 08:47:00

标签: java android

如果我有Handler handler = new Handler()并为其handler.postDelayed(xxx, xxx)运行延迟任务,是否可以检查是否已调用postDelayed()

5 个答案:

答案 0 :(得分:20)

没有直接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.

答案 1 :(得分:19)

  

是否可以检查是否调用了postDelayed()?

一个快速解决方法,在方法中将一些boolean变量指定为true,然后执行检查。

答案 2 :(得分:13)

发布Runnable时的处理程序获取带有“what”字段== 0的消息,所以理论上你可以调用hasMessages(0),但是你无法检查它是否已经给出了待处理的Runnable - 例如当发布r0和r1时你无法检查r0是否有待处理。

答案 3 :(得分:2)

Handler.post()只是sendMessageDelayed()的便捷包装方法,因此,如果要检查处理程序是否具有仍在运行的特定待处理Runnable,或者postDelayed()是否已用特定的Runnable调用,然后尝试使用以下类:

 public class HandlerWithID extends Handler {

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

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

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

答案 4 :(得分:0)

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

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

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