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 应用程序变慢的主要内容,如果未能解决你的问题,请参考以下文章
Oracle Apps应用JDE在Oracle公有云上焕发青春
BlackBerry - 如何为Application设置图标?