2

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

无论我如何尝试改变电流Displayable,它都不会改变。

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

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

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

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

4

1 回答 1

1

您找到了规范的正确部分,但不是全部 - 这就是您感到困惑的原因。

您对setCurrent 方法的效果不是立竿见影的理解确实是 100% 正确的,这就是 API javadocs 指定的,好的:

  • Display.setCurrent(Displayable)

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

现在,您注意到当前的 Displayable 正在更改但未显示,这让我觉得您使用getCurrent并期望它能够可靠地告诉屏幕何时显示。事实并非如此,请查看 API 文档:

  • Display.getCurrent()

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

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

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

避免 UI 事件线程中的负载过重。commandAction当or keyPressedor etc内部有很多事情要做时pointerPressed,只需生成一个新线程即可。如果您在 midlet 中发现这种情况,请考虑研究本教程以找出正确的方法:

  • 网络、用户体验和线程

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

于 2012-07-24T21:31:30.930 回答