我在类a
中创建了一个runnable来调用另一个类中的静态函数' b'并使用静态bool值来决定是否再次调用runnable。它是一个自动掷骰子应用程序,并在课堂上的运行功能' a'将在mainactivity中调用,b类中的函数是关于掷骰子(启动,停止,重启)的过程。 a类代码
private boolean endtag;
final Handler handler = new Handler();
final Runnable rend = new Runnable() {
@Override
public void run() {
buttons.endbutton();
endtag = buttons.turnend;
Log.e("1", "round1");
}
};//runnable for dices stopping and getting the value
final Runnable rcountinue = new Runnable() {
@Override
public void run() {
buttons.continuebutton();
Log.e("2", "round1");
}
};//runnable for throwing the dice again
final Runnable rrun=new Runnable(){
@Override
public void run() {
handler.post(rend);
if(!buttons.turnend)
{
handler.postDelayed(rcountinue, 2000);
handler.postDelayed(rrun,6000);
}
}
};
public void run() {
delay = 0;
buttons.startbutton();
handler.postDelayed(rrun,4000);
}
b类(=按钮)中的代码如下:
public static boolean turnend;
public static void startbutton() {
//code for dice running
Log.e("button", "start");
}
public static void endbutton() {
//code for stopping the dice running and check whether can stop throwing dices again
if(some situations)
{
turnend=true;
Log.e("button", "valuechange");
}
Log.e("button", "end");
}
public static void continuebutton() {
//code for throwing dice again
Log.e("button", "continue");
}
排队是,当我启动应用程序时,runnable总是比我预期的运行一次。如下面的日志所示。它应该在值更改后停止,但是rrun再运行一次。为什么以及如何解决它?
11-17 15:03:11.580:E /按钮(10851):开始
11-17 15:03:15.600:E /按钮(10851):值更改
11-17 15:03:15.600:E /按钮(10851):结束
11-17 15:03:19.590:E /按钮(10851):继续
11-17 15:03:21.600:E /按钮(10851):结束
答案 0 :(得分:0)
以下是您的代码中发生的事情。
a.run()
调用startbutton()
,打印 start
。然后它发布rrun
以在4000毫秒内执行。rrun.run()
发布rend
即时执行,检查!buttons.turnend
,显然是true
,因此它会在2000毫秒内发布rcountinue
并{{1}在6000毫秒内(也就是它自己)。rrun
调用rend.run()
打印 buttons.endbutton
和 valuechange
,并设置end
到buttons.turnend
。然后打印 true
(未在转储中显示)。round1
拨打rcountinue.run()
,打印 buttons.continuebutton()
。然后打印 continue
(未在转储中显示)。round1
再次发布rrun.run()
以立即执行,检查rend
,但这次是!buttons.turnend
,所以它不会再做任何事情。< / LI>
false
再次调用rend.run()
显然遵循执行路径,该路径仅打印 buttons.endbutton
(代码中的不匹配括号表示您从中删除了某些内容)在复制粘贴日志转储后,您似乎也更改了代码中的超时,但这并不会影响整体流程。