嗨我有两个屏幕,我从不想弹出,因为他们从网上加载数据,我不想一直加载它。但是,如果我尝试从一个导航到另一个,我得到一个RuntimeException,说我试图按下已经显示的屏幕。 pushScreen是否有解决方法?改变屏幕的东西?
答案 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架构只会增加代码膨胀和维护,而且并不是解决像你描述的问题所必需的。
无论如何,只是一个想法。