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

Eug*_*ene 39 java android

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

Tri*_*ode 21

没有直接的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.
Run Code Online (Sandbox Code Playgroud)

  • 发出sendEmptyMessage(1)后,hasMessages(1)仍然立即返回false.您是否在应用中使用了此代码? (6认同)

Sim*_*iak 21

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

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


psk*_*ink 14

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


Phi*_*o99 5

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);
    }
}
Run Code Online (Sandbox Code Playgroud)