作成日

1 November 2010

その他の必要条件

  • Adobe AIR SDK 2.0
  • Flash Builder 4.0.1もしくはFlash Professional CS5
 
2010年6月9日にAdobe AIR 2がリリースされました。約2年半振りのメジャーバージョンアップとなり、多くの新機能追加と機能強化が行われています。本連載(全9回予定)では、 それら機能について詳しく説明するとともに、サンプルアプリを用いながらその使い方を解説していきます。

第1回 Adobe AIR 2をはじめよう
第2回 サーバーソケット/ データグラムソケットなどのネットワーク系機能
第3回 Safari 4.0.3 と同等の WebKit を搭載
第4回 プリンタ情報の取得や印刷ダイアログの制御
第5回 OSネイティブな機能との連携
第6回 OSネイティブとの統合
第7回 グローバルエラーハンドラー/IMEテキスト入力の機能強化

本記事では、Adobe AIR 2から導入されたグローバルエラーハンドラーとIMEテキスト入力の機能強化について解説します。これらの機能はFlash Player 10.1と同様に導入されています。

本記事のサンプル:AIR2master07sample.zip

グローバルエラーハンドラー

これまで実行時に発生したエラーは事前に処理するコードがない場合、エラー表示などを出すことができませんでした。そのため、ユーザに対して問題が発生したことを通知できず、エラー発生時点で一連の処理がストップしユーザ入力にフォーカスが戻るため、内部的に適切でない状態のアプリケーションが存続することがありえました。このような問題を回避するために、事前に処理していないエラーを捕捉するのが「グローバルエラーハンドラー」の機能です。

グローバルーエラーには、以下の2つがあります。

  • アプリケーション内のエラー
  • 使用するLoaderオブジェクト内でSWFをロードしたときに発生したエラー

前者はLoaderInfoのuncaughtErrorEventsプロパティ、後者はLoaderのuncaughtErrorEventsプロパティで提供されるEventDispatcherのサブクラスUncaughtErrorEventsに、UncaughtErrorEventのUNCAUGHT_ERRORイベントをハンドルすることで捕捉できるようになります。

WindowedApplicationベースでの実装

WindowedApplicationをベースとするAIRアプリケーションの場合は、applicationCompleteイベントでloaderInfoプロパティのuncaughtErrorEventsにイベントハンドルを追加します。

サンプルコード:GlobalErrorHandleSample.mxml

protected function windowedapplication1_applicationCompleteHandler(event:FlexEvent):void { WindowedApplication(event.target).loaderInfo.uncaughtErrorEvents .addEventListener(UncaughtErrorEvent.UNCAUGHT_ERROR, unCaughtErrorHandler); }

このようにするのは、loaderInfoプロパティで値を参照できるようになるタイミングが、ロード完了後だからです。そのためアプリケーションのcreationCompleteイベントでエラーが起こりうる不確実な処理を開始する実装などは、グローバルエラーハンドラーで捕捉できないので避けるべきです。

ActionScript(Sprite)ベースでの実装

ActionScriptのみで構成されたアプリケーションでは、メインクラスのコンストラクタ内かそれ以降でloaderInfoプロパティを参照できます。よってコンストラクタでイベントハンドルを追加するのが良いでしょう。

public class MyApplication extends Sprite { public function MyApplication() { loaderInfo.uncaughtErrorEvents .addEventListener(UncaughtErrorEvent.UNCAUGHT_ERROR, uncaughtErrorHandler); } }

イベントハンドラーの処理

イベントハンドラーではUncaughtErrorEvent クラスのeventオブジェクトが提供され、そのerrorプロパティでスローされたオブジェクトを参照できます。throwステートメントはErrorクラスのオブジェクトに限らずスローすることができるため、errorプロパティは型指定されていません。is演算子で型によって適切に処理する必要があります。

サンプルコード:GlobalErrorHandleSample.mxml

protected function uncaughtErrorHandler(event:UncaughtErrorEvent):void { var message:String; if (event.error is Error) { message = Error(event.error).message; } else if (event.error is ErrorEvent) { message = ErrorEvent(event.error).text; } else { message = event.error.toString(); } Alert.show(message, "global error"); }

グローバルエラーハンドラーの使いどころ

規模が大きいアプリケーションの実装では、ビュー、ロジックと複数の層から成ることが珍しくありません。特に最下層に位置することが多いネットワーククライアントの実装では、外的要因により予期せぬエラーが発生しやすい部分です。こういったところのエラーをイベントディスパッチ方式でビュー層まで一つひとつ戻さなくても、グローバルエラーハンドラーによってスローを上手く使い、直接ビュー層で処理するといったことも可能になります

IMEテキスト入力の機能強化

Adobe AIR 1.5からFlash Player 10と同様にFlash Text Engine(FTE)が提供され、テキストメトリック、フォーマットおよび双方向テキストの制御が可能になりました。しかしそれに伴うIMEテキスト入力の対応が十分ではありませんでした。Adobe AIR 2からFTE用にIME機能を強化するクラスが提供されています。

  • flash.text.ime.IIMEClient インターフェース
  • flash.text.ime.CompositionAttributeRange クラス
  • flash.text.engine.ITextSupportインターフェース

ただし、これらのクラスを開発者がそのまま使用する必要はありません。FTEをラップしたフレームワークText Layout Framework (TLF)を利用することで機能対応がなされます。AIR 2のIME機能強化が盛り込まれたTLFは、すでにFlex 4.1やFlash Professional CS5に入っています。

図のように日本語の縦書きのインライン編集などが機能強化によって可能になりました。

おわりに

本記事で紹介したグローバルエラーハンドラーやIMEテキスト入力の機能強化はいずれもアプリケーションの根幹にかかわる機能です。特にグローバルエラーハンドラーは基本的にどのようなアプリケーションでも、実行環境でのバグ検出やユーザービリティの向上のため、実装しておくのが望ましいでしょう。