我怀疑我的一个Codename One项目中的错误是由同一个侦听器的并发执行引起的(如果用户多次快速点击按钮,并在结束执行之前调用其侦听器) ...我在代码中添加了一个锁变量,以避免同时执行多个操作,从而解决了该错误。
这是我第一次遇到这种问题。在网络上阅读时,建议使用synchronized
Java关键字(但是我不确定在这种情况下它是否有用)。
我的问题是Codename One是否支持synchronized
Java关键字。
答案 0 :(得分:2)
synchronized
在Codename One中可以正常工作,但是如果您使用动作监听器,除非我们遇到一个巨大无法想象的错误,否则它不可能解决问题。
所有事件,绘制,生命周期方法等都在EDT上调用。这是一个单线程,因此在单个线程上单击两次按钮即可。 isEDT()
将毫无意义。从触摸屏交互一直到组件本身的事件一直使用EDT,您可以通过invokeAndBlock
方法进行测试。
更可能的情况是,按钮上的操作侦听器之一使用invokeAndBlock()
,这可能会触发事件分发链中的怪异副作用。 AndWait
方法,对话框等在内部使用{{1}}。
答案 1 :(得分:-1)
使用syncronized
将阻止方法的并行执行,但实际上会通过迫使线程等待任何当前执行而使发出的请求排队。
在处理这种情况时,您可能希望通过在首次单击后的一段时间内(或在结果计算的整个过程中)禁止用户交互,通过禁用并重新启用按钮来消除按钮的点击 >