43

如果我有一个Handler handler = new Handler()并为它运行一个延迟的任务handler.postDelayed(xxx, xxx),是否可以检查是否postDelayed()被调用?

4

5 回答 5

22

没有直接的 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.
于 2013-04-18T08:53:45.147 回答
22

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

一种快速修复,在方法中将一些boolean变量分配给 true,然后执行检查。

于 2013-04-18T08:55:43.443 回答
16

处理程序在发布 Runnable 时获取带有“what”字段 == 0 的消息,因此理论上您可以调用hasMessages(0),但您无法检查它是否已给出挂起的 Runnable - 例如,在发布 r0 和 r1 时,您无法检查 r0 是否处于挂起状态或不是。

于 2013-04-18T09:52:23.940 回答
7

Handler.post()只是一个方便的包装方法sendMessageDelayed(),所以如果你想检查一个处理程序是否有一个特定的挂起的 Runnable 仍在运行,或者是否postDelayed()使用特定的 Runnable 调用,然后尝试使用以下类:

 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);
    }
}
于 2018-07-13T02:01:46.447 回答
0

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

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

    public MyClass{
    
    boolean isAlreadyDoing;
.
.
.
.
    
    if(!isAlreadyDoing){
        isAlreadyDoing=true;
        new Handler(Looper.myLooper()).postDelayed(() -> {
        isAlreadyDoing=false;
         //Do task here
        }, delaytTime);
      }
    }
于 2021-01-11T18:17:23.983 回答