我正在创建一个使用蓝牙的Java ME应用程序。
无论我如何尝试更改当前Displayable
,它都不会改变。
我的应用程序将一个名为“devices”的文本框设置为启动时当前可显示的文本框,并将当前更改为另一个类中方法中名为“devicelist”的列表。
但是当我尝试将电流更改回文本框(设备)时,它不会改变。
我尝试在midlet类中使用display对象,并在其他类中使用gestDisplay。但List对象(deviceList)仍然是当前可显示的。
更新根据我的测试,似乎有一些错误。 TextBox(设备)是当前可显示的,但当我检查isShown
时,它会变为false。相反,使用isShown
测试时的另一个Displayable:List(deviceList)也是如此。
虽然api规范表明setCurrent
方法的效果不是立竿见影的,但是当前的Displayable正在改变,但它没有显示在屏幕上。这在真实设备和模拟器中都会发生。
答案 0 :(得分:1)
你找到了规范的一部分但不是全部 - 这就是为什么你感到困惑。
您理解 setCurrent方法的效果不是立即确实是100%正确的,这就是API javadoc指定的,OK:
...此更改通常不会立即生效。它可能会被延迟,以便它在事件传递方法调用之间发生,尽管不能保证在调用下一个事件传递方法之前发生。 setCurrent()方法立即返回,无需等待更改发生......
getCurrent
并期望它可靠地判断何时显示屏幕。事实并非如此,请看一下API文档:
获取此MIDlet的当前Displayable对象...返回的对象实际上可能不可见...可以调用Displayable.isShown()方法来确定Displayable在显示器上是否实际可见。 / SUP>
isShown()
(而不是getCurrent)来查找何时需要的屏幕变得可见。虽然...
...您遇到延迟的事实,尤其是即使在模拟器上也会发生这种情况,让我觉得您的midlet可能存在设计问题。我会强烈建议检查是否存在与UI相同的线程中运行的某些“重量级”活动,阻止它并使其无响应。
避免UI事件线程中的重载。当commandAction
或keyPressed
或pointerPressed
等内容有很多内容时,只需生成一个新线程即可。如果您在midlet中发现这种情况,请考虑学习本教程以找到正确的方法:
本文介绍了MIDlet如何在不影响用户界面的情况下建立网络连接。它包括六个迭代示例,说明多线程网络和等待屏幕的使用......