秘密結社ぎゅう☆ぎゅう倶楽部でタグ「Flex」が付けられているもの

 Flex等では、"System.gc()"を呼び出すことによって、強制的にガベージコレクションを実行することができますが、Silverlightにはそういうのないのかな、と思っていたら、ちゃんと存在していたんですね。

GC.Collect();

 呼び出しはたったのこれだけ。
 パフォーマンスが著しく低下するから、呼び出さない方が良いよ、なんて言われても、どうしても呼び出したい時というのはあるものです。
 でも、くれぐれも使いどころにはお気を付けください。

 Flex3でフォームアプリケーションを開発していた時に、ある画面でTABキーを押すと、アプリケーション全体がフリーズしてしまうという、不可解な現象に遭遇しました。

 フリーズ中にデバッガで一時停止してみたところ、FocusManagerが、次にフォーカスを設定するコンポーネントを探すために、ひたすらループしているのが原因のようでした。
 そのアプリケーションは、ひとつのMXML上にViewStackで結構な数の画面を配置してあり、コンポーネントもかなりの数に達していて、それらのコンポーネントの可視状態や有効状態などを、ひとつひとつチェックしているらしいのです。

 とそこまではわかったのですが、なぜそんな挙動をしているのかがさっぱりわからず、しかも他の画面では同じ現象も発生しないので、ものすごーく悩んでいたのですが、ほんのちょっとした修正で、無事に解決に至りました。

 その修正内容とは「tabIndexを指定する」ということです。

 なんでこれで解決したのかはわかりませんが、Flex SDK 3.2には、FocusManager絡みのバグがあるようなので、もしかするとそれが原因なのかもしれません。
 とにかくこれからは、tabIndexは必ず指定しようと、固く心に誓ったのでした。

 画像一覧で、表示形式をリストとサムネイルの一覧で切り替えられるという仕様があったので、ViewStackを使ってみることにしました。

 ViewStackの上にDataGridとListを配置して、切り替えボタンのクリックイベントハンドラで、ViewStackのselectedItemIndexプロパティを変更してやると(実際にはデータバインディングを使用していますが)、あっという間にリスト切り替えの実装が完了してしまいました。

 あー、楽ちん。

 と、ここまでは良かったのですが、画像一覧のクリックイベントを処理するために、DataGridとListの両方にクリックイベントハンドラを追加したところ、addEventListnerでNullPointerExceptionが発生してしまいました。

 まさかとは思ったのですが、どうやらViewStack上に配置された初期状態で不可視状態のコンポーネントのインスタンスは、初めて表示されるタイミングで生成される仕様みたいです。

 「こんなんだったらViewStackなんか使わないで自前で処理した方が早いわボケー」

 と思いつつ調べてみたところ、ViewStackのcreationPolicyというプロパティをallに設定することにより、ViewStackの初期化の際に、ViewStack上に配置されたすべてのコンポーネントのインスタンスが生成されるようになり、万事解決めでたしめでたしと相成りました。

 ということで無事に一件落着したわけですが、この広い野原いっぱいインターネットの世界の中で、検索の末にこの解決策を発見したのが、同じアイレットの中のH君のCTOA日記内のエントリーだったというこのなんという偶然!

 なんて言ってみましたが、実際は偶然でもなんでもなく、AirやFlex関連で困った時にいろいろ検索していると、高い確率でCTOA日記に行き当たるので、即ちCTOA日記には、有益な情報がいっぱい詰まっているということです。

 そんなわけで、こんなブログより7倍(当社比)ためになるCTOA日記もよろしく。

 6月6日はドラえもんの日だと個人的に思っています。

 AirやFlexで扱うことができるエンコーディングは、デフォルトではUTF-8ですが、サーバ側のシステムの都合などで、UTF-8以外のエンコーディングを扱う必要が出てくる場合があります。
 サーバ側から返されるデータのエンコーディングがShift-JISで固定であれば、サーバからデータを取得する前に、以下の一行を追加するだけで、Shift-JISのデータを文字化けすることなく扱うことができます。

タグ