edt嵌入式确定性测试
我们上一次在2008年解释了EDT背后的一些概念,因此,我们很高兴再次撰写有关EDT的文章,在开发人员指南以及有关Udemy的课程中都有关于EDT的部分,但是由于这是最重要的了解在Codename One中,它几乎没有重复。关于EDT的好处之一是,其中的许多概念几乎与其他所有GUI环境(Swing / FX,Android,iOS等)中的概念相似。 因此,如果您能理解此说明,那么在其他平台上工作时也可能会有所帮助。
代号一可以具有任意数量的线程,但是在代号一中内部为事件调度线程创建了一个名为“ EDT”的线程。 这个名称不会处理线程错误,因为它处理包括绘画等在内的所有操作。
您可以将EDT想象成这样的循环:
while(codenameOneRunning) {
performEventCallbacks();
performCallSeriallyCalls();
drawGraphicsAndAnimations();
sleepUntilNextEDTCycle();
}
在Codename One中,一般的经验法则是:每次Codename One可能在EDT上调用其方法(除非另有明确说明),每次在Codename One中调用的内容都应在EDT上(除非另有明确说明) 。
有一些值得注意的特殊情况:
- NetworkManager / ConnectionRequest –在内部使用网络线程,而不是EDT。 但是,可以/应该从EDT调用它们。
- BrowserNavigationCallback –由于其独特的功能,必须在本机浏览器线程上调用它。
- 显示invokeAndBlock / startThread –创建全新的线程。
除了这些,几乎所有东西都在EDT上。 如果不确定,可以使用Display.isEDT方法检查您是否在EDT上。
违反EDT
您可以通过两种主要方式违反EDT:
- 从不是EDT线程的线程(例如,网络线程或由您创建的线程)中以Codename One调用方法。
- 在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/11/callserially-the-edt-invokeandblock-part-1-2.html
edt嵌入式确定性测试