スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

J2ME(S!アプリ)開発日記 その4

画面遷移を構成している中で困ったことがあった。
モーダルのダイアローグボックスを作ったつもりだったが、なぜか正常に動作しない。

問題出題画面で、確認ボタンを押したときに、確認画面に行き、そこから戻ってから次の問題に進むようにしたつもりだったが、確認画面に行ったときには、見えないがすでに次の問題に進んでいた。

なぜかよくわからなかったのだが、
Display#setCurrent()メソッドで別画面を指定したとき、別画面に遷移されるのだが、実際そこでブロックされるわけではなく、別画面の処理が進行している一方で、バックグラウンドで元の処理が進行してしまっているのだ。
「このメソッドは実際にディスプレイの表示が変更される前に直ちに呼び出し元へ戻ります。 」
とあった。
別スレッドで動いているのかと思い、別画面が表示されている間は、Thread.sleepを回して待機することにしたのだが、これをやると画面が真っ白になる。別スレッドで動いているわけではない。
仕方ないので、setCurrent()メソッドを読んだ後に処理を書かず、確認画面から処理を呼び出すようにした。

ここでロジックとViewを明確に分けるようにした。MVCモデルだ。
実際には、MVCと言っても、VとCは同じクラスにしている。論理的には分かれているが、結局のところController(Listener)はViewに密に結びついており、Viewクラスにリスナーをimplementしてしまうことが多い。リスナーを別クラスにすることも考えられるが、私は一緒にした方が可読性が高いと思う。

Modelだが結局ここはロジックとデータクラスで分離してしまった。データクラスにロジックを実装すると、複数のデータクラスをまとめて扱う場合、どっちのデータクラスに処理を実装すべきか悩む。むしろロジックは外出しにした方が汎用的だ。

簡素に作るはずが、だんだん凝ってきてしまう。
設定値も最初はハードコーディングしていたのだが、外の設定ファイル、JADに設定して、それを読み出すようにできないだろうかと思った。
Midlet#getAppProperty
でJADの属性を読み出せることがわかった。

また、辞書ファイルを読み出すとき、最初は単純なCSVファイルで、PC版との互換を完全に取らなくてもいいと思っていたが、結局、問題や答えや備考に改行を含めることができるフォーマットに対応するようにした。"\nでパースしたら思っていたほど難しくはなかった。
そう、StringTokenizerもないので、自分でパースのロジックを書く必要があった。

あとFormでStringItemを使っているときの問題は、改行の表示。
どうにもうまく行かない。改行を入れると2行分入ってしまったり、だからそれを取り除くと前の行につながってしまったりとどうもうまく行かない。

それから例外処理をどう扱うかというのも課題だった。
イベントドリブンのアプリの場合、どうしたらいいだろうか。Exceptionはどこにかえって行くのか。
自分が注目したのは、Controller(Listener)の部分。最初の画面の表示後は、すべてここから始まる。なので、すべてのFormのcommandAction()の実装をtry-catchで囲み、エラーがあった場合は、Alertクラスでエラー表示するようにした。catchではExceptionではなく、Throwableをcatchする。でないと、Uncaughted Errorとなってしまうことがある。何の例外がスローされるかわからない。

関連記事
スポンサーサイト

コメント

非公開コメント

プロフィール

dayan

Author:dayan
小職は、SE(システムエンジニア)を専門としておりますが、技術的な情報を中心に、それ以外に経済関連の日記、たわいもない日記も載せていきます。
[公式HPもよろしく!]

天気予報

-天気予報コム- -FC2-
リンク
ブロとも申請フォーム

この人とブロともになる

カテゴリー
最近の記事
ブログ内検索
最近のコメント
最近のトラックバック
RSSフィード
月別アーカイブ


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。