こんにちは、Web からデータをロードするので決してポップしたくない 2 つの画面があり、常にロードしたくないのです。ただし、ある画面から別の画面に移動しようとすると、既に表示されている画面をプッシュしようとしたことを示す RuntimeException が発生します。pushScreen の回避策はありますか? 画面切り替えみたいな?
2 に答える
Peter Strangeが、BlackBerryの画面セマンティクスについて非常によく説明しています。基本的に、(Rupakが示唆するように)アプリケーションロジックをフローから分離する必要があります。ユーザーがページを頻繁に再表示することを許可または奨励する場合は、データを1回ロードし、後で再表示できるように、適切な時間ローカルキャッシュに保持する必要があります。
Rupak と Richard が提案していることは確かに実行できます。しかし、別のオプションを提供させてください。それは、現在持っているものから再設計する必要が少なくなる可能性があります。
Screen
aがインスタンス化されるときに、コストのかかる操作を行っているようですね。そして、あなたはそれを複数回行うことを避けたいですか?
次のように画面を押していますか?
UiApplication.getUiApplication().pushScreen(new FooScreen());
UiApplication.getUiApplication().pushScreen(new BarScreen());
代わりに、後で再利用できるように、 screen をプッシュすると screen が保存されることを確認してください(少なくとも、ポップされるべきではないと思われるこれら 2 つの画面については)。私は通常、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
プッシュするたびに画面を再作成したり、ポップしたときにその状態を破壊したりするわけではありません。
これが本当にあなたの望んでいるものではなく、2 つの画面が実際には決してポップされるべきではないと確信している場合は、まったくポップされるべきではないかもしれませんScreens
。Manager
多分それらはサブクラスであるべきです。
Screen
おそらく、最初は 2 つの別々の画面として持っていたものの両方のコンテンツを論理的に管理する (2 つではなく) 1 つしかありません。したがって、それらを切り替えるには、単純に次のようにしますScreen
。
add(_fooManager);
remove(_barManager);
また
replace(_barManager, _fooManager); // logically similar to "changing" screens
基本的に、画面はプッシュとポップのセマンティクスを使用するように構築されています。それがうまくいかない場合は、Manager
サブクラスを使用してください。Screen
extends以来Manager
、この方法でリファクタリングするための最小限のコード変更が必要です。
画面を切り替えるための便利なトランジション機能の一部が失われます。ただし、BlackBerry コードが利用可能になる前に、BlackBerry コードを作成する必要があったため、フィールドの切り替えをアニメーション化するためのこのような代替手法に依存することを既に学びました。
ビューレイヤーをコントローラーレイヤーから完全に分離することは、多くの場合、適切な方法です。ただし、特にBlackBerryアプリの場合、MVCアーキテクチャに厳密に準拠しすぎると、コードの肥大化とメンテナンスが増加し、説明したような問題を解決する必要がない場合があると思います.
とにかく、ただの考えです。