如果我有Handler handler = new Handler()
并为其handler.postDelayed(xxx, xxx)
运行延迟任务,是否可以检查是否已调用postDelayed()
?
答案 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);
}
}