如果没有完成,我创建1分钟延迟计时器来关闭服务。看起来像这样:
private Handler timeoutHandler = new Handler();
在onCreate()
中timeoutHandler.postDelayed(new Runnable()
{
public void run()
{
Log.d(LOG_TAG, "timeoutHandler:run");
DBLog.InsertMessage(getApplicationContext(), "Unable to get fix in 1 minute");
finalizeService();
}
}, 60 * 1000);
如果我在这1分钟之前完成工作 - 我想取消这个延迟的事情但不确定如何。
答案 0 :(得分:44)
你无法用匿名的Runnable真正做到这一点。如何将Runnable保存到命名变量?
Runnable finalizer = new Runnable()
{
public void run()
{
Log.d(LOG_TAG, "timeoutHandler:run");
DBLog.InsertMessage(getApplicationContext(), "Unable to get fix in 1 minute");
finalizeService();
}
};
timeoutHandler.postDelayed(finalizer, 60 * 1000);
...
// Cancel the runnable
timeoutHandler.removeCallbacks(finalizer);
答案 1 :(得分:12)
如果您不想保留runnable的引用,可以直接致电:
timeoutHandler.removeCallbacksAndMessages(null);
...如果token为null,则将删除所有回调和消息。
答案 2 :(得分:8)
您可能希望使用postDelayed
替换sendMessageDelayed
的使用,如下所示:
private Handler timeoutHandler = new Handler(){
@Override
public void handleMessage(Message msg)
{
switch (msg.what){
case 1:
((Runnable)msg.obj).run();
break;
}
}
};
然后发布消息:
Message m = Message.obtain();
m.what = 1;
m.obj = new Runnable(){
public void run()
{
Log.d(LOG_TAG, "timeoutHandler:run");
DBLog.InsertMessage(getApplicationContext(), "Unable to get fix in 1 minute");
finalizeService();
}
};
timeoutHandler.sendMessageDelayed(m, 60 * 1000);
然后取消:
timeoutHandler.removeMessages(1);
无法跟踪必要的可运行。
答案 3 :(得分:2)
如果我在这1分钟之前完成工作 - 我想取消这个延迟的事情但不确定如何。