为什么runnable不使用当前运行的值

时间:2014-11-17 20:50:19

标签: android multithreading runnable

我在类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):结束

1 个答案:

答案 0 :(得分:0)

以下是您的代码中发生的事情。

  1. a.run()调用startbutton(),打印 start 。然后它发布rrun以在4000毫秒内执行。
  2. 4000毫秒后rrun.run()发布rend即时执行,检查!buttons.turnend,显然是true,因此它会在2000毫秒内发布rcountinue并{{1}在6000毫秒内(也就是它自己)。
  3. rrun调用rend.run()打印 buttons.endbutton valuechange ,并设置endbuttons.turnend。然后打印 true (未在转储中显示)。
  4. 2000毫秒后round1拨打rcountinue.run(),打印 buttons.continuebutton() 。然后打印 continue (未在转储中显示)。
  5. 4000毫秒后round1再次发布rrun.run()以立即执行,检查rend,但这次是!buttons.turnend,所以它不会再做任何事情。< / LI>
  6. false再次调用rend.run()显然遵循执行路径,该路径仅打印 buttons.endbutton (代码中的不匹配括号表示您从中删除了某些内容)
  7. 在复制粘贴日志转储后,您似乎也更改了代码中的超时,但这并不会影响整体流程。