BlackBerry JDE 5 应用程序变慢

Posted

技术标签:

【中文标题】BlackBerry JDE 5 应用程序变慢【英文标题】:BlackBerry JDE 5 Application Slowing Down 【发布时间】:2013-07-01 06:36:59 【问题描述】:

我对编写 BlackBerry 应用程序还很陌生,所以也许这是我忽略的一件愚蠢的事情。我必须使用 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,它在类构造过程中被实例化。

【问题讨论】:

你把上面显示的代码放在哪里?它是否在 Screen 子类的构造函数中,也许? methodToGetObjectArray() 返回什么?它会返回很多、很多对象还是只返回几个? @Nate - 它不在构造函数中。它在该屏幕上调用特定方法时运行(以更新其显示)。 methodToGetObjectArray() 返回大约 250 个元素,但我发现手机处理得很好。只要添加了DateField,事情就会变慢。 这与您在问题中所说的不同。在问题中,它说添加ObjectChoiceField DateField 会导致问题。如果ObjectChoiceField 不是问题,请不要向我们展示该代码。如您所见,向我们展示问题的代码。此外,您仍然没有真正回答关于您显示的代码在在哪里 运行的问题。最后,250 个选择其实很多。这听起来像是用户讨厌滚动浏览的 UI。 250真的有必要吗? @Nate 是的,不幸的是,他们需要选择他们的居住国家/地区。我会根据您的其他问题更新我的问题。 感谢 Nico 的澄清。 【参考方案1】:

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

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

线程

首先,您所展示的代码基本上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 线程上。例如,如果您的代码在运行在 UI 线程上的 Manager#sublayout() 方法内,则直接添加新字段将触发 sublayout() 被递归调用,直到出现堆栈溢出。使用invokeLater() 可以提供帮助,方法是将代码块的运行推迟到sublayout() 完成。但是,从屏幕类的 构造函数 中,您不需要这样做。

对象选择字段

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

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

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

【讨论】:

感谢您的意见。就两件事。假设从构造函数调用的方法“基本上”仍在构造函数中。 displaySomeMethod() 在某个事件发生后被调用,而不是从构造函数中调用,这就是我抓住 UI 线程的原因。然后,ObjectChoiceField 似乎不是我的问题,只是DateField。我只用DateField 在屏幕上尝试了它,但它看起来仍然很慢(JDE 5)。感谢AutoCompleteField 的提醒,一定会试一试。 @NicoHuysamen,我想我是在回应您对 “从 Screen 扩展类的构造函数调用 displaySomeLayout() 方法”的问题的更新。。这就是为什么我声明了在构造函数中运行的方法。如果第一个陈述不是您要说的,那很好。但是,对于您在上一条评论中提到的这个“某些事件”,如果该事件在 UI 线程上运行,您可能仍然不需要 invokeLater() 调用。如果事件回调不在 UI 线程上,那么当然可以。

以上是关于BlackBerry JDE 5 应用程序变慢的主要内容,如果未能解决你的问题,请参考以下文章

Blackberry应用程序中的Web服务存根

Oracle Apps应用JDE在Oracle公有云上焕发青春

在BlackBerry应用程序中实现平滑滚动

BlackBerry - 如何为Application设置图标?

目标跟踪(二) SDE, JDE, FairMot, CenterTrack, Bytetrack 跟踪比较

Locator.geocode(...) 在 OS 5 设备(Blackberry Java)中冻结/阻止 UI