1

我对编写黑莓应用程序还很陌生,所以也许这是我忽略的一件愚蠢的事情。我必须使用 JDE 5(客户端要求)来支持较旧的 BlackBerry Curve 8520 手机。

我正在经历的是,一旦我DateField在我的界面上放置一个,应用程序就会大大减慢,导致 UI 卡顿。即使是只有一个DateField和一个按钮的简单布局也具有相同的效果。然后,一旦我进入下一个布局,一切都又好了。

其中一种布局的创建方式如下(如果这是不正确的做法,请发表评论):

public void displaySomeLayout() {
    final ButtonField okButton = new ButtonField("OK");
    final DateField dobField = new DateField("Birthday", System.currentTimeMillis(), DateField.DATE);

    /* some other non-ui code */

    UiApplication.getUiApplication().invokeLater(new Runnable() {
        public void run() {
            applicationFieldManager.addAll(new Field[] {
                    dobField,
                    okButton
            });
        }
    });
}

然后应用程序会减慢很多。有时,一分钟后它又开始正常响应,有时则没有。

displaySomeLayout()方法是从Screen扩展类的构造函数中调用的。然后是在类构造期间实例化applicationFieldManager的私有。VerticalFieldManager

4

1 回答 1

0

我不确定问题出在您向我们展示的代码中。我认为它在其他地方。

但是,这里有一些改进您显示的代码的建议:

穿线

首先,您展示的代码本质上Screen子类构造函数中运行的。这段代码几乎没有区别:

public MyScreen() {
   Field f = new ButtonField("Hello", ButtonField.CONSUME_CLICK);
   add(f);
}

和这个:

public MyScreen() {
   addField();
}

private void addField() {
   Field f = new ButtonField("Hello", ButtonField.CONSUME_CLICK);
   add(f);
}

因此,因为您的代码正在屏幕类的构造函数中运行,所以它应该已经在 UI 线程上运行。因此,没有理由在UiApplication.getUiApplication().invokeLater()这里使用。相反,只需使用这个:

public void displaySomeLayout() {
    final ButtonField okButton = new ButtonField("OK");
    final DateField dobField = new DateField("Birthday", System.currentTimeMillis(), DateField.DATE);

    /* some other non-ui code */

    applicationFieldManager.add(dobField);
    applicationFieldManager.add(okButton);
}

有时,您确实需要使用invokeLater()来运行 UI 代码,即使您已经在 UI 线程上。例如,如果您的代码在Manager#sublayout()运行在 UI 线程上的方法内部,则直接添加新字段将触发sublayout()递归调用,直到出现堆栈溢出。invokeLater()通过推迟代码块的运行直到sublayout()完成,使用可以提供帮助。但是,从屏幕类的构造函数中,您不需要这样做。

对象选择字段

我也担心ObjectChoiceField你说你使用的是 250 种选择。您可以尝试仅使用 10 或 20 个选项来测试该字段,看看是否会有所不同。

但是,即使 250 选择ObjectChoiceField不是您的性能问题的原因,我仍然建议使用不同的 UI。

在 BlackBerry Java 上,您可以使用AutoCompleteField。可以为该字段提供您现在使用的所有国家/地区选项。用户开始输入一个国家的前几个字母,很快,列表就缩小到匹配的那些。我个人认为这是通过大量选择的更好方法。

于 2013-07-01T22:59:04.570 回答