如果我有一个Handler handler = new Handler()
,然后运行一个延迟任务handler.postDelayed(xxx, xxx)
,有可能检查postDelayed()
是否被调用了吗?
虽然没有直接的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.
是否有可能检查postDelayed()方法是否被调用了?
一个快速的解决方案是,在方法中指定一个布尔类型变量来表示方法已被调用,然后进行检查。
当提交一个Runnable时,Handler会获取标记为“what”字段等于0的Message。理论上,您可以调用hasMessages(0)
方法,但您不能检查是否有待处理的Runnable——例如,当提交r0和r1时,您无法检查r0是否处于待处理状态。
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);
}
}
步骤1: 首先,添加一个类变量 (不是局部变量)。
步骤2: 使用该变量检查处理程序是否正在运行。
public MyClass{
boolean isAlreadyDoing;
.
.
.
.
if(!isAlreadyDoing){
isAlreadyDoing=true;
new Handler(Looper.myLooper()).postDelayed(() -> {
isAlreadyDoing=false;
//Do task here
}, delaytTime);
}
}