【问题标题】:Order of executed threads执行线程的顺序
【发布时间】:2014-08-14 14:44:01
【问题描述】:

在视觉上,我希望我的应用按以下顺序显示四个 Toast:

  1. createToast("开始延迟 RandomCue 方法");
  2. createToast("延迟开始");
  3. createToast("延迟结束");
  4. createToast("延迟的 RandomCue 方法结束");

但是,结果顺序是:

  1. createToast("开始延迟 RandomCue 方法");
  2. createToast("延迟的 RandomCue 方法结束");
  3. createToast("延迟结束");
  4. createToast("延迟开始");

我的总体目标是创建一个显示图像并每 3 秒更改一次的程序。播放器可以按一个按钮,图像会改变 1.5 秒。因此,有两种方法,一种是使用countdowntimer换图,另一种是使用imagebutton对应的onClick方法换图。

我遇到的问题是链接中提供的代码(从 onclick 方法中调用的方法)应该更改图像,将 bool 值设置为 false,等待 1.5 秒,然后更改相同的 bool值恢复为真。

虽然 bool 值为 true,但应该跳过更改图片的方法,但事实并非如此,我不知道为什么,但我认为这与我在下面创建的要点中的代码有关。

所以我遇到的问题是,当单击按钮时,图像会按预期更改,但有时由于第一种方法无法识别玩家响应,因此图像会再次更改太快,因此不应该更改图像。

 public void delayedRandomCue(final long a){
    didPlayerRespond = true;
    createToast("start of delayed RandomCue Method");
    randomCue();
    Thread delay = new Thread() {
        public void run() {
            try {
                createToast("start of delay");
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }finally {
                createToast("end of delay");
                didPlayerRespond = false;
            }
        }
    };delay.start();

    createToast("end of delayed RandomCue Method");
}

https://gist.github.com/cjayem13/d32446ceb8c6d9626c68#file-easyfragment-Java https://gist.github.com/cjayem13/d32446ceb8c6d9626c68

https://gist.github.com/cjayem13/d0a0b124dfe17666be25#file-easyfragment-Java https://gist.github.com/cjayem13/d0a0b124dfe17666be25

 onclick(){
delayedRandomCue(final long a)
}

 randomCue();
    Thread cueThread = new Thread(){
        public void run() {
                try {
                    while (fComm.fragmentGetTimerBool()) {
                        if(!didPlayerRespond) {
                            if (decTime > 1000) {
                                Thread.sleep(decTime);
                            } else {
                                Thread.sleep(1000);
                            }
                            decTime -= 50;
                            randomCue();
                        }
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                    saveScore();
                }
            // turn into end of all pics triggers bonus sTimerOn = false;  fComm.fragmentScoreResponse(100);
            //createToast("Bonus for completing all possible answers");
        }
    }; cueThread.start();

【问题讨论】:

    标签: java android


    【解决方案1】:
    public void delayedRandomCue(final long a){
            didPlayerRespond = true;
    

    这首先发生

     createToast("start of delayed RandomCue Method"); 
            randomCue();
            Thread delay = new Thread() {
                public void run() {
    

    这发生在后台,异步。

                    try {
                        createToast("start of delay");
                        Thread.sleep(5000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }finally {
    

    这发生在后台,异步运行并完成后

                        createToast("end of delay");
                        didPlayerRespond = false;
                    }
                }
            };delay.start();
    

    这是第二个,因为它与方法的其余部分同步执行。

     createToast("end of delayed RandomCue Method");
        }
    

    【讨论】:

      【解决方案2】:

      这并不能回答你关于祝酒顺序的问题,但你确定,当你说

      我遇到的问题是链接中提供的代码(方法 从 onclick 方法中调用)应该改变图像, 将布尔值设置为false,等待1.5秒,然后更改相同 bool 值返回 true。

      当bool值为true时,改变图片的方法是 应该被跳过,但事实并非如此,我不知道为什么 但我认为这与我创建的要点中的代码有关 下面。

      是这样吗?

      看起来更像,如果boolean设置为false,需要跳过其他改变图片的方法,只要是true,就需要周期性的改变图片。

      试试吧,也许你的图片在用户触发onClick后不会很快改变。

      【讨论】:

      • 我不确定我理解你的意思。目前,我有两种方法,第一种方法每 3 秒更改一次图片,第二种方法在用户单击按钮时更改图片。为了使第一种方法在第二种方法更改图片后不会立即更改图片,第一种方法仅在 bool 为 true 时运行。当第二种方法运行时,它会使 bool false 5 秒,但第一种方法在 5 秒结束之前仍然运行。我不确定我是否理解您告诉我要尝试的内容。
      最近更新 更多