|
Unofficial "CLDC 1.1 + MIDP 2.0" API Reference. (日本語版) |
|||||||||
前のパッケージ 次のパッケージ | フレームあり フレームなし |
参照先:
説明
クラスの概要 | |
---|---|
MIDlet | MIDlet は MID Profile アプリケーションです。 |
例外の概要 | |
---|---|
MIDletStateChangeException | 要求された MIDlet の状態移行が失敗あるいは拒否されたことを示す例外です。 |
MIDlet パッケージは Mobile Information Device Profile アプリケーションとアプリケーションを実行する環境(ランタイム環境)とのインタフェースを定義します。 Mobile Information Device Profile のアプリケーションを MIDlet と言います。
MIDP はデバイスに関する限られたリソースを複数の MIDP アプリケーションまたは MIDlet によって共有することができるアプリケーション・モデルを定義します。 それは MIDlet が何であるか、どのようにパッケージされるか、どのような実行環境が MIDlet によって利用可能であるか、リソースの管理にデバイスがどのように振舞うべきであるのかを定義します。 アプリケーション・モデルは、スイートを形成する複数の MIDlet を、ただ1つの Java 仮想マシンのコンテキストの中に一緒にパッケージし、どのようにリソースを共有するのかを定義します。 1セットのポリシーおよびコントロールを必要とするクラス・ファイルを、デバイスの限られたリソースとセキュリティ・フレームワークにおいて共有することを可能にします。
MIDP アプリケーションは、それを開発し、テストし、配布し、そして実行するために MIDP 仕様で規定された機能だけを使用しなければなりません。
MIDlet スイートの要素は以下の通りです:
MIDlet をインストールし、選択し、実行し、削除するためにユーザーが必要とする機能は、各デバイスに実装されると仮定しています。 「アプリケーション管理ソフトウェア」という用語は、これらのデバイス定義の機能について、まとめて言及する際に使用します。 アプリケーション管理ソフトウェアは MIDlet のインストール、開始、停止およびアンインストールするための環境を提供します。 それは MIDlet スイートのインストール、実行および削除の際に発生するエラーを取り扱い、ユーザーと対話する責任があります。 それは MIDP 仕様によって必要とされる Java 実行環境を MIDlet に提供します。
1つまたはそれ以上の MIDlet を1つの JAR ファイルにパッケージすることができます。
MIDlet は MIDlet
クラスを拡張するクラスと他のクラスから成り、それぞれが MIDlet にとって必要とされます。
JAR ファイルのマニフェストは MIDlet のインストールと実行の際に使用する属性を含みます。
MIDlet は、アプリケーション管理ソフトウェアによって実行される構成要素です。
MIDlet スイートが呼び出されるとき、クラスを実行する Java 仮想マシンが必要となります。
MIDlet の新しいインスタンスは、アプリケーションによって自身を作成、開始、一時停止および破棄するよう MIDlet に指示するために使用します。
MIDlet 間のデータと他の情報の共有は、個々の API とそれらの実装によって制御されます。 例えば、レコード管理システム API は MIDlet スイートに関連するレコード・ストアを MIDlet 中で共有するときに使用するメソッドを規定しています。
MIDP 1.0 仕様は、それぞれの MIDlet スイートが MIDlet で利用可能な全てのデバイス・センシティブな機能へのアクセスを防ぐために、サンドボックスによって動作を抑制していました。 そのサンドボックスの概念はこの仕様においても使用します。そして、全ての信頼されていない MIDlet スイートが制限を受けます。 この仕様のあらゆる実装が、信頼されていない MIDlet スイートを動作させることをサポートしなければなりません。
MIDP 2.0 はセンシティブであるとみなして制限する API の使用を許可することができる、信頼するアプリケーションの概念を導入します。 デバイスが MIDlet スイートを信頼すると決定するなら、デバイスはポリシーによって示されるようにアクセスを容認します。 MIDP アプリケーションのためのセキュリティ・セクションは、信頼されていないおよび信頼されているアプリケーションの概念と資格について説明します。
MIDP は MIDlet に提供される実行環境を定義します。 実行環境は MIDlet スイート中の全ての MIDlet によって共有されます。そして、どのような MIDlet も一緒にパッケージされた他の MIDlet と対話できます。 アプリケーション管理ソフトウェアはアプリケーションを主導して、以下を MIDlet に提供します:
CLDC と Java 仮想マシンはマルチスレッド、ロックと同期、バイト・コードの実行、メソッドのディスパッチなどを提供します。 1つの仮想マシンのスコープは、全てのポリシー、ネーミング、リソース管理です。 デバイスが複数の仮想マシンをサポートするなら、それぞれにはそれぞれ独自のスコープのネーミングおよびリソース管理ポリシーを持つでしょう。 MIDlet スイートは CLDC あるいは MIDP によって定義されたパッケージ中に含まれるクラスを含むことはできません。
MIDP は MIDP API を実装するクラスを提供します。 実装は、アプリケーション・プログラマがこれらの保護されたシステム・パッケージの全てのクラスに対して、オーバーライド、変更、追加できないことを確実にしなければなりません。
ただ1つの JAR ファイルが MIDlet クラスの全てを含みます。 MIDlet は JAR ファイル、MIDP、CLDC の中の全てのクラスのロードおよびメソッドの呼び出しを行うことができます。 これら3つの範囲の中の全てのクラスが、JAR ファイルによる MIDlet の実行環境において共有されます。 それらのクラスを通してアクセス可能な全ての状態が、MIDlet のために動作している全ての Java クラスでも使用可能です。 MIDlet スイートによって使用中の全ての MIDlet、MIDP および CLDC のオブジェクトを含む1つの空間があります。 同時実行問題を避けるために必要であれば、通常の Java ロッキングと同期基本命令を使用すべきです。 各ライブラリは MIDlet がどのように同時実行を扱うのか、そして安全にマルチスレッド環境を実行するために、どのようにそれらを使用すべきであるのかを規定します。
MIDlet のクラス・ファイルは実行するためだけに使用可能であり、リソースとしての読み出し、(実行目的以外の)再利用のための抽出のどちらもできません。 CLDC の実装は常に適切な様式で JAR ファイルの中身を解釈および格納します。
java.lang.Class.getResourceAsStream
を使用することで JAR ファイルから Java クラスではないファイルを利用可能です。
例えば、マニフェストをこのように使用することができます。
それが存在しているなら、MIDlet ディスクリプタ・ファイルの中身を javax.microedition.midlet.MIDlet.getAppProperty
メソッドで使用可能です。
1つまたはそれ以上の MIDlet が1つの JAR ファイルにパッケージされます:
開発者は利用対象者、デバイス、ネットワーク、ロケールおよび権限のために、適切に JAR ファイルのコンポーネントを作成し、配布する責任があります。 例えば、特定のロケールにおいて、リソース・ファイルをそのロケールに必要である文字列とイメージを含むように変更するでしょう。
JAR マニフェストはアプリケーション管理ソフトウェアによって使用され、MIDlet スイートを識別およびインストールし、アプリケーション・ディスクリプタに存在しない属性のデフォルト属性を定義します。 属性はマニフェストとオプションのアプリケーション・ディスクリプタの両方における使用のために定義されます。
以下に示す事前定義属性によって、アプリケーション管理ソフトウェアは MIDlet を識別、取得、インストールおよび呼び出しを行います。
属性名 | 属性解説 |
---|---|
MIDlet-Name | ユーザーが MIDlet を識別する MIDlet スイートの名前。 |
MIDlet-Version | MIDlet スイートのバージョン番号。 バージョン番号は、ユーザーとのコミュニケーションと同様に、インストールとアップグレード用にアプリケーション管理ソフトウェアでそれらを使用できるように書式化します。 |
MIDlet-Vendor | MIDlet スイートを提供する組織名。 |
MIDlet-Icon | MIDlet スイートを表現する JAR 中の PNG ファイルの大文字小文字を区別する絶対名。 アプリケーション管理ソフトウェアがスイートを特定するためのアイコンを表示するときに使用すべきです。 |
MIDlet-Description | MIDlet スイートの説明文。 |
MIDlet-Info-URL | さらなる MIDlet スイートについて説明する情報への URL。 書式と意味は各体系を定義する各種 RFC と RFC2396 に従わなければなりません。 |
MIDlet-<n> | JAR ファイルの n 番目の名前、アイコンおよびクラスをカンマ区切りで分離記述します。
<n>の最も低い値は 1 でなければならず、そして連続した序数を使用しなければなりません。
最初に欠損したエントリでリストは終了します。
その後(その他)の全ての追加エントリは無視します。
名前、アイコンおよびクラスにおける前後の連続空白は無視します。
|
MIDlet-Jar-URL | JAR ファイルをロードできる URL。 書式と意味は各体系を定義する各種 RFC と RFC2396 に従わなければなりません。 絶対および相対 URL の両方をサポートしなければなりません。 相対的な URL のためのコンテキストはこのアプリケーション・ディスクリプタをロードした URL です。 |
MIDlet-Jar-Size | JAR ファイルのバイト数。 |
MIDlet-Data-Size | MIDlet によって必要とされる永続データの最小バイト数。 デバイスはそれ自身のポリシーに応じて追加のストレージ機構を提供することができます。 デフォルトはゼロです。 |
MicroEdition-Profile | システム・プロパティ microedition.profiles と同じ書式と値を使用する、必要な J2ME プロファイル(例えば、"MIDP-2.0" )。
デバイスはリストアップされたプロファイルの全てを実装していなければなりません。
プロファイルのいずれかが実装されていないのであれば、インストールは失敗しなければなりません。
複数のプロファイルはブランク(Unicode U+0020 )で分離します。 |
MicroEdition-Configuration | システム・プロパティ microedition.configuration と同じ書式と値を使用する、必要な J2ME コンフィギュレーション(例えば、CLDC-1.0 )。 |
MIDlet-Permissions | MIDlet スイートの機能に重要な、ゼロかそれ以上のパーミッション。 用法の詳細については MIDP アプリケーションのためのセキュリティ・セクションを参照してください。 |
MIDlet-Permissions-Opt | MIDlet スイートの機能に重要ではない、ゼロかそれ以上のパーミッション。 用法の詳細については MIDP アプリケーションのためのセキュリティ・セクションを参照してください。 |
MIDlet-Push-<n> | MIDlet を登録し、インバウンド接続を扱います。
詳細については PushRegistry を参照してください。 |
MIDlet-Install-Notify | 詳細については OTA 仕様を参照してください。 |
MIDlet-Delete-Notify | 詳細については OTA 仕様を参照してください。 |
MIDlet-Delete-Confirm | 詳細については OTA 仕様を参照してください。 |
いくつかの属性は複数の値を使用します。それらの属性ではカンマ(Unicode U-002C
)によって値を切り離します。
それぞれの値における、前後の空白(Unicode U-0020
)およびタブ(Unicode U-0009
)は無視します。
バージョン番号には Major.Minor[.Micro]
(X.X[.X]
)という書式があります。このうち.Micro
部分は省略することができます(もしも.Micro
部分を省略しないのであれば、デフォルトはゼロとします)。
さらに、バージョン番号の各部分は最大2桁の10進数数字(すなわち、0
から 99
)であることが求められます。
バージョン番号は Java(TM) 製品バージョン割り振り仕様 http://java.sun.com/products/jdk/1.2/docs/guide/versioning/spec/VersioningSpecification.html(さかき注:現在リンク切れしています)で説明されています。
例えば MIDlet スイートの最初のバージョンを指定するのに 1.0.0
を使用します。
バージョン番号の各部分において、先行するゼロは有効ではありません。
例えば 08
は 8
と等価です。
また 1.0
も 1.0.0
と等価です。
しかし 1.1
は 1.0.1
ではなく 1.1.0
と等価です。
MIDlet-Version
タグが存在しない場合 0.0.0
であると仮定します。これは全てのゼロではないバージョン番号が MIDlet スイートのより新しいバージョンであるとみなすことを意味します。
マニフェストは JAR ファイルの内容に関する情報を提供します。
JAR ファイルの書式と仕様は http://java.sun.com/products/jdk/1.2/docs/guide/jar/index.html(さかき注:現在リンク切れしています)から得ることができます。
JAR マニフェストに関連する詳細については、JDK JAR マニフェスト文書を参照してください。
MIDP 実装はマニフェストの仕様の定義に基づいて 72 バイト以上の長い行の取り扱いを実装しなければなりません。
属性はマニフェストの中において1回以上存在してはなりません。
属性が重複する場合の効果については不定です。
MIDlet.getAppProperty
を使用して要求すると、属性がアプリケーション・ディスクリプタで多重化されていないのであればマニフェストの属性が MIDlet に渡されます。多重化の取り扱いに関してはアプリケーション・ディスクリプタを参照してください。
マニフェストは以下の属性を含まなければなりません:
MIDlet-Name
MIDlet-Version
MIDlet-Vendor
マニフェストあるいはアプリケーション・ディスクリプタは以下の属性を含まなければなりません:
MIDlet-<n>
MIDlet-Profile
MIDlet-Configuration
マニフェストは以下の属性を含むことができます:
MIDlet-Description
MIDlet-Icon
MIDlet-Info-URL
MIDlet-Data-Size
MIDlet-Permissions
MIDlet-Permissions-Opt
MIDlet-Push-<n>
MIDlet-Install-Notify
MIDlet-Delete-Confirm
MIDlet-Delete-Confirm
MIDlet-
または MicroEdition-
で開始しないアプリケーション特有の属性
例えば、カードゲームを仮定するスイートでのマニフェストは以下の例のようになるでしょう:
MIDlet-Name: CardGames MIDlet-Version: 1.1.9 MIDlet-Vendor: CardsRUS MIDlet-1: Solitaire, /Solitare.png, org.cardsrus.games.Solitare MIDlet-2: JacksWild, /JacksWild.png, org.cardsrus.games.JacksWild MicroEdition-Profile: MIDP-2.0 MicroEdition-Configuration: CLDC-1.0 Solitaire-Author: John Q. Public
完全限定クラス名をディレクトリとファイル名にマッピングするということを基本に、MIDlet の全ての Java クラスが標準構造を用いて JAR ファイルに置かれることが求められます。
各ピリオドをスラッシュ(/
)に変換し、そして拡張子.class
を追加します。
例えば、クラス com.sun.microedition.Test
は JAR ファイル中の com/sun/microedition/Test.class
に置かれます。
各 JAR ファイルはアプリケーション・ディスクリプタを伴うことがあります。 アプリケーション・ディスクリプタは MIDlet を管理するためにアプリケーション管理ソフトウェアによって JAR マニフェストと連携して使用し MIDlet 自身のための構成特有の属性として使用します。 ディスクリプタによって、デバイス上のアプリケーション管理ソフトウェアは MIDlet スイートの完全な JAR ファイルをロードする前に MIDlet がデバイスに適合しているか否かを確認することができます。 またディスクリプタによって JAR ファイルを変更せずに、構成特有の属性(パラメータ)を MIDlet に提供することができます。
デバイスが MIDP アプリケーション管理ソフトウェアへ、アプリケーション・ディスクリプタをディスパッチできるようにするため、ファイル拡張子と MIME タイプを IANA に登録済みです:
jad
です。
text/vnd.sun.j2me.app-descriptor
です。
属性の事前定義セットは MIDlet をアプリケーション管理ソフトウェアが識別、取得およびインストールすることを可能にします。
MIDlet はディスクリプタ・ファイルに存在する全ての属性を入手できます。
開発者はアプリケーション独自定義を目的とする、MIDlet-
または MicroEdition
で開始しない属性を使用することができます。
属性名は、大文字と小文字を区別し、完全に一致しなければなりません。
属性が重複する場合の効果は不定です。
MIDlet.getAppProperty
メソッドを呼び出すことにより、MIDlet が指定した名前の属性を取得できます。
アプリケーション・ディスクリプタは以下の属性を含まなければなりません:
MIDlet-Name
MIDlet-Version
MIDlet-Vendor
MIDlet-Jar-URL
MIDlet-Jar-Size
アプリケーション・ディスクリプタは以下の属性を含むことができます:
MIDlet-<n>
MicroEdition-Profile
MicroEdition-Configuration
MIDlet-Description
MIDlet-Icon
MIDlet-Info-URL
MIDlet-Data-Size
MIDlet-Permissions
MIDlet-Permissions-Opt
MIDlet-Push-<n>
MIDlet-Delete-Notify
MIDlet-Delete-Confirm
MIDlet-
または MicroEdition-
で開始しないアプリケーション特有の属性
唯一のアプリケーションを特定するための必須属性である MIDlet-Name
、MIDlet-Version
および MIDlet-Vendor
はディスクリプタおよびマニフェスト・ファイルに多重化していなければなりません。
もしそれらが一致しないのであれば(同じアプリケーションではないのだから)その JAR をインストールしてはなりません。
アプリケーション・ディスクリプタにおける、他のマニフェストの属性の多重化は必要ではありません。そして、信頼されていない MIDlet スイートのための、マニフェストおよびディスクリプタ・ファイルには両方に同じ属性を含んでいても、それらの値は異なるかもしれません。 MIDlet スイートが信頼されていないと、ディスクリプタ・ファイルからの値はマニフェスト・ファイルからの値で上書きされます。 MIDlet スイートが信頼されるなら、アプリケーション・ディスクリプタの値はマニフェストの対応する属性値と一致していなければなりません。
MIDlet は MIDlet あるいは関連するコンフィギュレーションとプロファイル(例えば、CLDC と MIDP)仕様に基づいて定義された以外の MIDlet-
または MicroEdition
から始まるどのような属性も、マニフェストおよびアプリケーション・ディスクリプタに加えてはなりません。
アプリケーション管理ソフトウェアは認識しない属性を無視しなければなりません。
一般的に、アプリケーション・ディスクリプタの書式は、コロンを後置する属性名、属性の値および改行の順に構成されます。 値の前後の空白は無視します。 属性の順序は任意です。
アプリケーション・ディスクリプタを転送および保存するためにエンコードすることが許容されますが、以下の規則を使用し、解析を行う前に Unicode へ変換しなければなりません。
例えば ISO-8859-1 エンコードされたファイルは InputStreamReader
に相当するものを通じて適切なエンコードによる読み出しを行う必要があります。
ディスクリプタを転送するためのデフォルト文字エンコードは UTF-8 です。
もしも、それをサポートするなら HTTP によって転送されたディスクリプタは、ストリームを UCS-2 に変換するために Content-Encoding ヘッダや Content-Type ヘッダの charset パラメータなどの HTTP 標準コンテント・ネゴシエーション・メカニズムを使用すべきです。
アプリケーション・ディスクリプタ: * 属性行 属性行: 属性名 ":" [ 余白 ] 属性値 [ 余白 ] 新しい行 属性名: 1*<制御コードまたはセパレータを除く全ての Unicode 文字> 属性値: * 値文字 | 値文字 *( 値文字 | 余白 ) 値文字 値文字: <全ての有効な Unicode キャラクタから制御コードと余白を除いたもの> 新しい行 = 1* 改行 ; 空行は許容し無視する 改行: キャリッジ・リターン 行送り | 行送り キャリッジ・リターン = <Unicode キャリッジ・リターン (U+000D)> 行送り = <Unicode 行送り (U+000A)> 余白: 1*( 空白 | タブ ) 空白 = <Unicode 空白 (U+0020)> タブ = <Unicode 水平タブ (U+0009)> 制御コード = <Unicode キャラクタ U+0000 - U+001F および U+007F> セパレータ: "(" | ")" | "<" | ">" | "@" | "," | ";" | ":" | "'" | <">| "/" | "[" | "]" | "?" | "=" | "{" | "}" | 空白 | タブ
例えば、カードゲームを仮定しているスイートのためのアプリケーション・ディスクリプタは以下のようになるでしょう:
MIDlet-Name: CardGames MIDlet-Version: 1.1.9 MIDlet-Vendor: CardsRUS MIDlet-1: Solitaire, /Solitare.png, com.cardsrus.org.Solitare MIDlet-2: JacksWild, /JacksWild.png, com.cardsrus.org.JacksWild MicroEdition-Profile: MIDP-2.0 MicroEdition-Configuration: CLDC-1.0 MIDlet-Description: Really cool card games MIDlet-Jar-URL: http://www.cardsrus.com/games/cardgames.jar MIDlet-Jar-Size: 7378 MIDlet-Data-Size: 256
各 MIDlet は MIDlet
クラスを継承していなければなりません。
MIDlet
クラスは MIDlet の適切な開始、停止および破棄を可能にします。
MIDlet は、アプリケーション管理ソフトウェアと意思疎通を図るようにアプリケーション・ディスクリプタの引数で要求することができます。
MIDlet スイートは public static void main()
メソッドを持つ必要はありません。
もし存在しているなら、アプリケーション管理ソフトウェアにおいてそれを無視しなければなりません。
アプリケーション管理ソフトウェアは MIDlet を開始するために CLDC が求める初期クラスを提供します。
MIDlet スイートがデバイス上にインストールされるとき、クラス、リソース・ファイル、引数および永続的なストレージがデバイスで使用できるように準備します。 ユーザーは MIDlet を、デバイスのアプリケーション管理ソフトウェアを通じて使用することができます。
MIDlet が実行されるとき、MIDlet の最初のクラスのインスタンスは、public
で引数のないコンストラクタを使用して作成されます。そして、MIDlet
のメソッドを呼び出して、様々な状態の変化を逐次 MIDlet へ伝えます。
MIDlet
のメソッドを通して、MIDlet は状態の変化を要求するか、または状態変更をアプリケーション管理ソフトウェアに通知することができます。
MIDlet が完了するか、アプリケーション管理ソフトウェアによって終了するとき、それを破棄します。そして MIDlet が使用していたリソース(作成した全てのオブジェクトおよびクラスを含む)を回収します。
MIDlet は System.exit
を呼び出してはなりません。MIDlet が呼び出すと SecurityException
を throw します。
通常の状態の Java クラスは、それらのクラスのために、他のクラスがロードされることによる影響を受けることはありません。 全てのクラスに関しても参照するために必要なクラスをロードします。そして、通常の静的初期化が行われます。
javax.microedition.midlet のクラス | 解説 |
---|---|
MIDlet | アプリケーション管理ソフトウェアによって、開始、停止および破棄できるようにするために、MIDlet が継承する必要があります。 |
MIDletStateChangeException | アプリケーションが変化の要求を受け入れることができない場合に throw します。 |
MIDlet のライフサイクルは、以下のように MIDlet
とその環境を通じての手順を定義します。
以下の定義が MIDlet
ライフサイクルの中で使用されます:
アプリケーション管理ソフトウェア - 各 MIDlet
を管理する、デバイスに含まれるソフトウェア操作環境の一部です。
これは MIDlet の状態をメンテナンスし、状態変化時に MIDlet
へ指示を与えます。
MIDlet
- デバイス上の MIDP アプリケーションです。
MIDlet
はアプリケーション管理ソフトウェアによって作成、開始、休止、破棄されます。
MIDlet
は MIDlet
API を通して他の MIDlet
に対する情報を得ることはできません。
MIDlet
の状態 - MIDlet
の状態は MIDlet
のインタフェースの定義に従って変更することができます。
さらに詳細なアプリケーションの状態は、そのアプリケーションのみに通知されます。
MIDlet
のステート・マシン(予め決められている複数の状態を、決められた条件に合わせて、決められた状態へ遷移すること)は、アプリケーションの振る舞いが一貫しており、ユーザーが期待するように全てのデバイスにおいてもほぼ同等に動作することを目指して設計されています:
各 MIDlet
の有効な状態は以下の通りです。
状態名 |
説明 |
休止 |
|
アクティブ |
|
破棄 |
注記:この状態へは1度だけ遷移します。 |
MIDlet
の状態と遷移は次の通りです。
MIDlet
を実行する典型的な順序は以下の通りです。
アプリケーション管理ソフトウェア |
|
アプリケーション管理ソフトウェアは |
|
アプリケーション管理ソフトウェアは、 |
|
アプリケーション管理ソフトウェアは、デバイスが電話などの他の機能によって使用されるか、または別の MIDlet を実行できるようにするため、MIDlet が使用しているリソース量を大幅に減少させる必要がある場合があります。
|
|
アプリケーション管理ソフトウェアは |
それがそのように設計されているなら、MIDlet は状態の保存またはユーザーの選択とクリーンナップを実行します。 |
destroyApp
- MIDlet
は全ての状態を保存し、全てのリソースを開放する処理を記述します。
notifyDestroyed
- MIDlet
がクリーンナップを行ったことをアプリケーション管理ソフトウェアに伝えるために呼び出します。
notifyPaused
- MIDlet
が休止したことをアプリケーション管理ソフトウェアに伝えるために呼び出します。
resumeRequest
- MIDlet
が再度開始することを求めているとアプリケーション管理ソフトウェアに伝えるために呼び出します。
getAppProperty
- MIDlet
から指定された名前のプロパティを取得します。
アプリケーションは MIDlet
メソッドの実行における競合条件を避ける対策を実施すべきです。
それぞれのメソッドが他のメソッドの状態変更による同時実行問題を避けるために、それ自身の同期を取る必要があります。
これは、Java 仮想マシンの速度を簡単に測定するために MIDlet
ライフサイクルを使用する例です。
import javax.microedition.midlet.*; /** * この MIDlet の例は、簡単なタイミングテストを実行します。アプリケー * ション管理ソフトウェアによって開始される際に、テストを行うための * 別のスレッドを生成します。このスレッドは、いつテストを終了するか * を、アプリケーション管理ソフトウェアに通知します。 * startApp、pauseApp、destroyApp の各メソッドを使用しますので、それ * ぞれの要求をどのように扱って移行するかを確かめてください。 */ public class MethodTimes extends MIDlet implements Runnable { // タイミングテストを行うスレッド Thread thread; /** * Start は、タイミングテストを行うスレッドを作成します。 * このメソッドはディスパッチャーが止まるのを避けるために直ちに処理を戻すべきです。 */ public void startApp() { thread = new Thread(this); thread.start(); } /** * Pause は、スレッドフィールドをクリアしスレッドを停止します。 * 停止後に処理を再開する場合は最初からやり直します。 */ public void pauseApp() { thread = null; } /** * Destroy は必要なクリーンナップ処理を全て行います。 * スレッドは停止され、結果は処理しません。 */ public void destroyApp(boolean unconditional) { thread = null; } /** * タイミングテストを行います。 * 単純に 100000 回メソッド呼ぶのにかかる時間を計ります。 * スレッドが既にカレントのスレッドでない場合は直ちに終了します。 */ public void run() { Thread curr = Thread.currentThread(); // どのスレッドがカレントであるか取得します。 long start = System.currentTimeMillis(); for (int i = 0; i < 100000 && thread != curr; i++) { empty(); } long end = System.currentTimeMillis(); // タイミングテストが終了したか否かを判定します。 // 終了している場合は何もせずに戻ります。 // そしてアプリケーションの残りの部分は実行しません。 if (thread != curr) { return; } long millis = end - start; // ここにこの例の範囲の外に経過時間を報告する処理が入ります。 // 全てが終わったらクリーンナップして終了します。 destroyApp(true); notifyDestroyed(); } /** * 空のメソッド。 */ void empty() { } }
|
Unofficial "CLDC 1.1 + MIDP 2.0" API Reference. (日本語版) |
|||||||||
前のパッケージ 次のパッケージ | フレームあり フレームなし |
公式仕様書原文の著作権表記等(※): Mobile Information Device Profile Specification ("Specification") Version: 2.0 Status: FCS Release: November 5, 2002 Copyright 2002 Sun Microsystems, Inc. and Motorola, Inc. All rights reserved. | ※ただしこの API リファレンスは英語仕様を一語一句正確に翻訳したものではなく、一度私が英語の仕様原文を読んだ上で元の意味と構造をなるべく保つように書き起こしたものです。このため一部は完全に異なる説明となっています。また CLDC 1.1 部分は同仕様の範囲外であるため、まったく参考とはしていません。 ※仕様書のライセンス上、問題は無いと考えておりますが、万が一問題があるとお考えの関係者の方がいらっしゃいましたらメールにて連絡をいただけると幸いに存じます(第一言語に日本語、第二言語に英語を希望しますが、返信は基本的に日本語で行います)。 |