【问题标题】:Codename One - When a sleep is fine?代号一 - 什么时候可以睡觉?
【发布时间】:2017-12-21 12:44:55
【问题描述】:

Shai 对我之前的问题Codename One - Avoid screen size change on Android on app startup 的评论向我提出了这个新问题:

在哪些情况下睡眠很好?我指的是TestUtils.waitFor() 的使用,而不会有杀死应用程序的风险。 例如,如果我已经展示了一个 Form,并且我想展示它至少半秒,那么我在展示下一个 Form 之前插入一个 sleep,可以吗?

我的意思是:

startForm.addShowListener(e -> {
        startForm.setTransitionOutAnimator(CommonTransitions.createFade(1000));
        TestUtils.waitFor(500);
        nextForm.show();
    });
startForm.show();

【问题讨论】:

    标签: codenameone


    【解决方案1】:

    Wait for 很聪明,因为它与 Thread.sleep() 等不同,它“正确”地在 EDT 上休眠:

    public static void waitFor(final int millis) {
        if(verbose) {
            log("waitFor(" + millis + ")");
        }
        if(Display.getInstance().isEdt()) {
            Display.getInstance().invokeAndBlock(new Runnable() {
                public void run() {
                    try {
                        Thread.sleep(millis);
                    } catch (InterruptedException ex) {
                    }
                }
            });
        } else {
            try {
                Thread.sleep(millis);
            } catch (InterruptedException ex) {
            }
        }
    }
    

    但是,如果您在“有问题的”生命周期方法之一中调用睡眠,您可能会冒险。例如。 init/start/constructor 等必须完成,否则本机操作系统线程假定应用程序没有启动。由操作系统调用的 stop 方法也是如此,它期望在很短的时间内完成。

    除此之外,我们主要隐藏本机操作系统线程的复杂性,因此尊重 EDT 的睡眠版本“应该”工作。我能想到的一个例外是浏览器导航回调,它显式公开了本机操作系统线程。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-24
      • 1970-01-01
      • 1970-01-01
      • 2016-01-08
      • 2017-08-11
      • 2018-10-13
      • 2020-01-09
      相关资源
      最近更新 更多