Java 为什么将removeCallbacks()与postDelayed()一起使用?

Java 为什么将removeCallbacks()与postDelayed()一起使用?,java,android,handler,runnable,postdelayed,Java,Android,Handler,Runnable,Postdelayed,我试图通过查看Android Studio中提供的全屏活动模板来理解其功能,尤其是我们将removeCallbacks()与postdayed()结合使用的一个特殊原因。在全屏活动模板中,当触摸屏幕时,会在一定的毫秒数后显示/隐藏状态栏和导航/系统栏,在此模板中为3000毫秒 private void hide(){ //先隐藏用户界面 ActionBar ActionBar=getSupportActionBar(); if(actionBar!=null){ actionBar.hide(

我试图通过查看Android Studio中提供的全屏活动模板来理解其功能,尤其是我们将
removeCallbacks()
postdayed()
结合使用的一个特殊原因。在全屏活动模板中,当触摸屏幕时,会在一定的毫秒数后显示/隐藏状态栏和导航/系统栏,在此模板中为3000毫秒


private void hide(){
//先隐藏用户界面
ActionBar ActionBar=getSupportActionBar();
if(actionBar!=null){
actionBar.hide();
}
mControlsView.setVisibility(View.GONE);
mVisible=false;
//安排runnable以在延迟后删除状态栏和导航栏

mHideHandler.removeCallbacks(mShowPart2Runnable);//每次执行单击时,您都会将事件发布到
消息队列
,该事件将在
UI\u ANIMATION\u DELAY
毫秒后执行(假设为300ms)

现在,当您执行连续单击时,您以这种方式发布事件:

SHOW - HIDE - SHOW - HIDE - ...
如果不执行
removeCallbacks()
,所有这些消息都将被执行,这意味着将执行
SHOW
HIDE
操作,这将导致此类故障行为

另一方面,当使用
removeCallbacks()时
您告诉我们,您不再对相反的事件感兴趣,也不希望该事件完全执行。例如,如果出现系统栏显示的情况,则下一次单击将在300毫秒后启动一个
隐藏
事件,您明确告诉我们“嘿,如果发布的某些事件应
显示系统栏
,请取消它们”

这样做的结果是,每次执行连续的单击事件时,已经发布到队列上的相反事件消息都将被取消。这确保了每次只有1条消息发布到队列上

系统UI可见,当前消息队列:

EMPTY
点击发生:

HIDE
SHOW (HIDE is being removed from queue)
HIDE (SHOW is being removed from queue)
点击发生:

HIDE
SHOW (HIDE is being removed from queue)
HIDE (SHOW is being removed from queue)
点击发生:

HIDE
SHOW (HIDE is being removed from queue)
HIDE (SHOW is being removed from queue)

因此,在结束时,当300毫秒被传递,并且此消息未从队列中删除时,将只执行最后一个事件。

我多次重新阅读了该问题。仍然不清楚问题的实质。你能重新措辞吗?@azizbekian不用担心,没问题。我已经编辑了我的问题,并添加了一些GIF,也许可以让你更轻松地描述对这个“问题”的解释。我真的只是想得到一个解释,为什么调用removeCallbacks()和不调用removeCallbacks()会有这么大的区别太棒了!你解释removeCallbacks()的方式很有道理。但是,你能澄清一下关于
消息队列的问题吗(
SHOW-HIDE-SHOW-HIDE-…)
中的延迟是否会延迟
消息队列中时发生
或者消息/runnable从
消息队列调度后是否会发生延迟。此外,这些消息/runnable会单独或同时发生延迟,即
延迟-显示-延迟-隐藏-延迟-显示-延迟-隐藏…
或者是
DELAY-SHOW-HIDE-SHOW-HIDE-…
?拥有
handler.post(runnable1300);
以及之后的
handler.post(runnable2300)
,将在大约300毫秒后执行
runnable1
runnable2
,但严格按照
runnable1
runnable2
的顺序执行,两者之间没有延迟。对于消息队列中的消息,每条消息之间会有延迟还是会立即连续执行re是消息之间的无延迟,假设它们以相同的延迟时间发布在同一帧上(就像
runnable1
runnable2
一样)。