嗨,我有两个屏幕我不想弹出,因为它们从网络加载数据,我不想一直加载它。但是,如果我尝试从一个导航到另一个,我会收到一个 RuntimeException 说我试图推送一个已经显示的屏幕。pushScreen 有解决办法吗?换屏之类的?
2 回答
Peter Strange在这里很好地解释了 BlackBerry 屏幕语义。本质上,您应该(如 Rupak 建议的那样)将应用程序逻辑与流程分开。如果您要允许或鼓励用户频繁地重新显示页面,您应该加载一次数据并在本地缓存中保留一段合理的时间,以便您以后可以重新显示它。
你当然可以按照 Rupak 和 Richard 的建议去做。但是,让我提供另一种选择,这可能需要对您目前拥有的东西进行更少的重新设计。
听起来您在Screen
实例化 a 时正在执行一些昂贵的操作,对吗?你想避免多次这样做吗?
你是这样推屏幕的吗:
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
extends Manager
,这应该涉及最少的代码更改来以这种方式重构。
您确实失去了一些用于切换屏幕的不错的过渡功能。然而,由于我必须在这些代码可用之前编写 BlackBerry 代码,所以我已经学会了依赖替代技术,例如这个用于动画字段切换的技术
将View层与Controller层完全分离通常是可行的方法。但是,特别是对于 BlackBerry 应用程序,我确实认为有时过于严格地遵循 MVC 架构只会增加代码膨胀和维护,并且对于解决您所描述的问题并不是真正必要的。
无论如何,只是一个想法。