java - 线程的执行顺序

标签 java android

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

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

但是,结果顺序是:

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

我的总体目标是拥有一个显示图像并每 3 秒更改一次的程序。玩家可以按下按钮,图像会改变 1.5 秒。因此有两种方法,一种是使用倒计时来换图,另一种是使用imagebutton对应的onClick方法来换图。

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

虽然 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();

最佳答案

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");
    }

关于java - 线程的执行顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25310948/

相关文章:

java - JOptionPane错误-乌龟和野兔赛跑

java - 创建全局 map Java

android - 如何使用新的 android.hardware.camera2 API 显示相机预览?

java - ListView 不在较小的屏幕上显示项目

java - 程序将点(.)计为字母字符

java - 如何创建具有两个映射字段的单独表?

android - 在 Firebase 上保存 Joda 日期

java - 非常奇怪的 Android NullPointerException

android - SharedPreferences 的应用程序上下文?

android - SSRS 网页的 Monodroid WebView 身份验证