无法使用setCurrent更改当前的Displayable

时间:2012-07-23 15:31:27

标签: java-me midp lcdui

我正在创建一个使用蓝牙的Java ME应用程序。

无论我如何尝试更改当前Displayable,它都不会改变。

我的应用程序将一个名为“devices”的文本框设置为启动时当前可显示的文本框,并将当前更改为另一个类中方法中名为“devicelist”的列表。

但是当我尝试将电流更改回文本框(设备)时,它不会改变。

我尝试在midlet类中使用display对象,并在其他类中使用gestDisplay。但List对象(deviceList)仍然是当前可显示的。

更新根据我的测试,似乎有一些错误。 TextBox(设备)是当前可显示的,但当我检查isShown时,它会变为false。相反,使用isShown测试时的另一个Displayable:List(deviceList)也是如此。 虽然api规范表明setCurrent方法的效果不是立竿见影的,但是当前的Displayable正在改变,但它没有显示在屏幕上。这在真实设备和模拟器中都会发生。

1 个答案:

答案 0 :(得分:1)

你找到了规范的一部分但不是全部 - 这就是为什么你感到困惑。

您理解 setCurrent方法的效果不是立即确实是100%正确的,这就是API javadoc指定的,OK:

  • Display.setCurrent(Displayable)

      

    ...此更改通常不会立即生效。它可能会被延迟,以便它在事件传递方法调用之间发生,尽管不能保证在调用下一个事件传递方法之前发生。 setCurrent()方法立即返回,无需等待更改发生......

  •   
  现在,您注意到当前Displayable正在更改但未显示让我觉得您使用getCurrent并期望它可靠地判断何时显示屏幕。事实并非如此,请看一下API文档:

  • Display.getCurrent()

      

    获取此MIDlet的当前Displayable对象...返回的对象实际上可能不可见...可以调用Displayable.isShown()方法来确定Displayable在显示器上是否实际可见。 / SUP>

  •   
  因此,简单的答案可能是使用isShown()(而不是getCurrent)来查找何时需要的屏幕变得可见。虽然...

...您遇到延迟的事实,尤其是即使在模拟器上也会发生这种情况,让我觉得您的midlet可能存在设计问题。我会强烈建议检查是否存在与UI相同的线程中运行的某些“重量级”活动,阻止它并使其无响应。

避免UI事件线程中的重载。当commandActionkeyPressedpointerPressed等内容有很多内容时,只需生成一个新线程即可。如果您在midlet中发现这种情况,请考虑学习本教程以找到正确的方法:

  • Networking, User Experience, and Threads

      

    本文介绍了MIDlet如何在不影响用户界面的情况下建立网络连接。它包括六个迭代示例,说明多线程网络和等待屏幕的使用......

  •