1

嗨,我有两个屏幕我不想弹出,因为它们从网络加载数据,我不想一直加载它。但是,如果我尝试从一个导航到另一个,我会收到一个 RuntimeException 说我试图推送一个已经显示的屏幕。pushScreen 有解决办法吗?换屏之类的?

4

2 回答 2

1

Peter Strange在这里很好地解释了 BlackBerry 屏幕语义。本质上,您应该(如 Rupak 建议的那样)将应用程序逻辑与流程分开。如果您要允许或鼓励用户频繁地重新显示页面,您应该加载一次数据并在本地缓存中保留一段合理的时间,以便您以后可以重新显示它。

于 2012-08-08T03:14:49.710 回答
0

你当然可以按照 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子类。由于Screenextends Manager,这应该涉及最少的代码更改来以这种方式重构。

您确实失去了一些用于切换屏幕的不错的过渡功能。然而,由于我必须在这些代码可用之前编写 BlackBerry 代码,所以我已经学会了依赖替代技术,例如这个用于动画字段切换的技术

将View层与Controller层完全分离通常是可行的方法。但是,特别是对于 BlackBerry 应用程序,我确实认为有时过于严格地遵循 MVC 架构只会增加代码膨胀和维护,并且对于解决您所描述的问题并不是真正必要的。

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

于 2012-08-12T08:29:38.110 回答