2012-08-07 204 views
1

嗨我有两个屏幕,我从不想弹出,因为他们从网络加载数据,我不想一直加载它。但是,如果我尝试从一个导航到另一个,我得到一个RuntimeException,说我试图推送已经显示的屏幕。是否有解决推送屏幕的工作?像改变屏幕的东西?黑莓推送屏幕没有弹出

+0

你试过了什么?显示一些代码? – Signare 2012-08-07 14:06:04

+0

从视图中分离应用程序逻辑。 – Rupak 2012-08-07 14:06:08

回答

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 

屏幕根本都建成使用push和pop语义。如果这不适合你,只需使用Manager子类。由于Screen延伸Manager,这应该涉及最小的代码更改重构这种方式。

你确实会失去一些用于切换屏幕的漂亮过渡特征。然而,因为我不得不写黑莓那些代码是可用之前,我已经学会了依靠替代技术,such as this one for animating the switching of Fields

完全分离查看层,从控制器层,往往是要走的路。但是,特别是对于BlackBerry应用程序,我确实认为有时过于严格地遵守MVC体系结构会增加代码膨胀和维护成本,而且并非真正需要解决像您所描述的问题。

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

1

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

+0

我在会议上看到了彼得。很高兴与他交谈:) – 2012-08-08 08:53:28