澄清代号一个UITimer的工作原理

时间:2019-01-01 10:36:02

标签: codenameone

我需要澄清一个代号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记录?

1 个答案:

答案 0 :(得分:1)

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

  • 在0点打开表单,并将计时器设置为15秒
  • 在7秒钟后进入其他形式
  • 30秒后恢复原始状态-计时器将在返回时立即触发

您还可以使用常规的TimerThread。但是,由于您的特定代码EasyThread在无限循环中运行,因此与常规线程相比,它没有任何好处。 EasyThread的好处在于它的工作处理能力。

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