【问题标题】:Clarification on how Codename One UITimer works澄清代号一 UITimer 的工作原理
【发布时间】:2019-01-01 21:00:58
【问题描述】:

我需要澄清一下代号一号UITimer

例如,如果我想每两秒执行一次相同的代码,像UITimer.timer(2000, true, () -> { do something; }); 这样的代码会一直工作,直到用户停留在当前的Form?对吗?

如果我想每两秒执行一次相同的代码不管显示的Form,我是否要使用与UITimer 不同的东西,比如自定义单独的线程?比如下面的代码?

    Form hi = new Form("Hi World", BoxLayout.y());
    hi.add(new Label("Hi World"));
    hi.show();

    EasyThread.start("MyTimer").run(() -> {
        boolean executeMe = true;
        while (executeMe) {
            Log.p("Do something every two seconds...");
            try {
                Thread.sleep(2000);
            } catch (InterruptedException ex) {
                Log.p("Stopping the EasyThread \"MyTimer\" because an exception");
                Log.e(ex);
                executeMe = false;
            }
        }
    });

此外,如果我执行此示例代码,记录的第一行是: [MyTimer] 0:0:0,59 - Codename One revisions: 8b451ecb7bfbe60baf91006441e7d7d9c46afe09 为什么我的自定义线程而不是 EDT 记录了该行?

【问题讨论】:

    标签: codenameone


    【解决方案1】:

    是的,UITimer 是与当前Form 关联的动画。它不绘制任何东西,而是使用在 EDT 上运行的内置动画机制。请注意,如果您离开表格并返回表格,计时器将继续,例如:

    • 在 0 时间打开表单并将计时器设置为 15 秒
    • 在 7 秒后进入不同的形式
    • 30 秒后返回原始状态 - 计时器将在返回时立即触发

    您也可以使用普通的TimerThread。但是,对于您的特定代码EasyThread 并没有提供优于常规线程的好处,因为它在无限循环中运行。 EasyThread 的好处在于它的工作处理能力。

    请注意,在使用此类计时器/线程时,您需要使用 callSerially 返回 EDT。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-30
      • 1970-01-01
      • 2021-08-04
      • 1970-01-01
      • 2011-03-07
      • 1970-01-01
      • 2018-06-15
      • 1970-01-01
      相关资源
      最近更新 更多