CallSerially EDT和InvokeAndBlock(第1部分)

我们在2008年最后一次解释了EDT背后的一些概念,因此我们再次对其进行了详尽的描述,在开发人员指南以及Udemy的课程中都有关于EDT的部分,但这是最重要的理解在Codename One中,它几乎没有重复。

关于EDT的好处之一是,其中的许多概念几乎与其他所有GUI环境(Swing / FX,Android,iOS等)中的概念相似。 因此,如果您能理解此说明,那么在其他平台上工作时也可能会有所帮助。

代号1可以具有任意数量的线程,但是在代号1的内部为事件调度线程创建了一个名为“ EDT”的线程。 此名称不具有线程正义性,因为它处理包括绘画等在内的所有操作。

您可以将EDT想象成这样的循环:

while(codenameOneRunning) {
     performEventCallbacks();
     performCallSeriallyCalls();
     drawGraphicsAndAnimations();
     sleepUntilNextEDTCycle();
}

在Codename One中,通常的经验法则是:每次Codename One可能在EDT上调用其方法(除非另有明确说明),每次在Codename One中调用的内容都应在EDT上(除非另有明确说明) 。

有一些值得注意的特殊情况:

  1. NetworkManager / ConnectionRequest –在内部使用网络线程,而不是EDT。 但是,可以/应该从EDT调用它们。
  2. BrowserNavigationCallback –由于其独特的功能,必须在本机浏览器线程上调用它。
  3. 显示invokeAndBlock / startThread –创建全新的线程。

除了这些,几乎所有东西都在EDT上。 如果不确定,可以使用Display.isEDT方法检查您是否在EDT上。

违反EDT

您可以通过两种主要方式违反EDT:

  1. 从不是EDT线程的线程(例如,网络线程或您创建的线程)中,以Codename One调用方法。
  2. 在EDT上执行CPU密集型任务(例如读取大文件)–这将有效地阻止所有事件处理,绘画等,使应用程序感觉很慢。

幸运的是,我们在模拟器中有一个工具:EDT违规检测工具。 这样可以有效地打印堆栈跟踪,以怀疑是否违反了EDT。 它不是傻瓜,可能会使您误判,但是它应该可以帮助您解决一些难以发现的问题。

那么如何防止EDT违规呢?

为了防止滥用EDT线程(EDT上的慢速操作),只需使用new Thread(),Display.startThread或invokeAndBlock生成一个新线程(稍后再介绍)。
然后,当您需要将更新广播回EDT时,可以使用callSerially或callSeriallyAndWait。

致电

callSerially调用它在事件调度线程上收到的runnable参数的run()方法。 如果您在单独的线程上,这将非常有用,但是当我们使用EDT并希望将操作推迟到EDT的下一个周期(在下一次有更多讨论)时,这也很有用。
callSeriallyAndWait与串行调用相同,但是在返回之前,它会等待callSerially完成。 由于明显的原因,它不能在EDT上调用。

在本迷你教程的第二部分中,我将讨论invokeAndBlock以及为什么我们已经在EDT上时为什么要使用callSerially。

翻译自: https://www.javacodegeeks.com/2014/10/callserially-the-edt-invokeandblock-part-1.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值