黑莓推动屏幕没有弹出

时间:2012-08-07 13:52:56

标签: blackberry

嗨我有两个屏幕,我从不想弹出,因为他们从网上加载数据,我不想一直加载它。但是,如果我尝试从一个导航到另一个,我得到一个RuntimeException,说我试图按下已经显示的屏幕。 pushScreen是否有解决方法?改变屏幕的东西?

2 个答案:

答案 0 :(得分:1)

Peter Strange对BlackBerry屏幕语义here给出了非常好的解释。基本上你应该(正如Rupak建议的那样)将应用程序逻辑与流分开。如果您打算允许或鼓励用户经常重新显示页面,您应该加载一次数据并在本地缓存中保留一段合理的时间,以便以后重新显示。

答案 1 :(得分:0)

你当然可以做Rupak和Richard的建议。但是,让我提供另一种选择,可能需要较少的重新设计,你现在拥有的。

Screen被实例化时,听起来你正在做一些昂贵的操作,对吧?你想避免多次这样做吗?

你是否按这样推动屏幕:

UiApplication.getUiApplication().pushScreen(new FooScreen());

UiApplication.getUiApplication().pushScreen(new BarScreen());

相反,请确保无论您按哪个屏幕保存屏幕,都要在以后重复使用(至少对于这两个屏幕,您认为不应弹出)。我通常有类似ScreenController类的东西来处理这个问题。所以,你可以这样做:

if (_fooScreen == null) {
    _fooScreen = new FooScreen();
}
UiApplication.getUiApplication().pushScreen(_fooScreen);

...

UiApplication.getUiApplication().pushScreen(_barScreen);
UiApplication.getUiApplication().popScreen(_fooScreen);  // popped but still referenced

...

UiApplication.getUiApplication().pushScreen(_fooScreen); // pushed, but not recreated

每次想要推动它时都不会重新创建屏幕,或者在弹出它时会破坏它的状态。

如果这真的不是你想要的,并且你确信你的两个屏幕真的应该永远,那么也许它们根本不应该是Screens。也许它们应该是Manager子类。

也许你只有一个Screen(而不是两个),它在逻辑上管理你最初拥有的两个独立屏幕的内容。因此,要在它们之间切换,您只需要单Screen执行此操作:

add(_fooManager);
remove(_barManager);

replace(_barManager, _fooManager);   // logically similar to "changing" screens

屏幕从根本上构建为使用推送和流行语义。如果这对您不起作用,只需使用Manager子类。自从Screen扩展Manager以来,这应该包含最少的代码更改,以便以这种方式进行重构。

你确实失去了切换屏幕的一些很好的转换功能。但是,由于我必须在可用之前编写BlackBerry代码,因此我已经学会依赖其他技术,such as this one for animating the switching of Fields

视图图层与控制器图层完全分开,通常就是这样。但是,特别是对于BlackBerry应用程序,我确实认为有时候过于严格地遵守MVC架构只会增加代码膨胀和维护,而且并不是解决像你描述的问题所必需的。

无论如何,只是一个想法。