ホームページ  >  記事  >  Java  >  J2ME 学習 - 初心者から熟練度 1 までの RMS

J2ME 学習 - 初心者から熟練度 1 までの RMS

黄舟
黄舟オリジナル
2016-12-19 13:54:431792ブラウズ

記録管理 システムは J2ME の重要なサブシステムであり、アプリケーション内でローカル データの永続的なストレージを実現することを目的としています。現在、ファイルシステムをサポートしている携帯情報機器は限られているため、記録 管理システムは、J2ME 開発者がローカル データ ストレージを実装するために推奨される方法です。この記事の目的は、レコード管理を包括的に紹介することです。 システム知識。

名前が示すように、レコード管理システムはデータを管理するためのシステムであり、レコードはシステム内で最も重要なエンティティです。モバイル デバイスのストレージ領域に格納されるのはフィールドではなく、バイト配列です。 Mobile Information Device PROfile (MIDP) 仕様では、どのような種類のデータをレコードとして保存できるかについては規定されていません。実際、レコードとは、画像やテキストなど、バイト配列で表現できるあらゆるデータです。記録 管理 システムの役割はレコードを保存して一意に識別することですが、データを表現するタスクはアプリケーションによって実行されるため、J2ME 開発者はストレージ領域内のデータの処理により多くのエネルギーを費やす必要があります。この目的は、MIDP の実装を簡素化し、J2ME サブシステムを可能な限り小型かつ柔軟にすることです。結局のところ、モバイル情報デバイスのストレージ容量とプロセッサーの能力は限られています。

レコードストアは、一連のレコードの順序付けされたコレクションであり、単独で存在することはできず、レコードストアに属している必要があります。 Record Store は、レコードの読み取りおよび書き込み操作がアトミックであり、データが破壊されないことを保証します。 API では、RecordStore は javax.microedition.rms.RecordStore によって実装されます。RecordStore の具体的な操作については、次の記事で詳しく紹介します。

MIDP仕様では、データの永続的なストレージを実現するために、モバイル情報デバイスはアプリケーションに少なくとも8Kの不揮発性ストレージスペースを提供する必要があると述べています。ただし、さまざまなデバイスによって提供されるスペースは同じではありません。 MIDlet の場合 スイートはレコード管理を使用します 次に、MANIFEST ファイルおよび JAD ファイルの MIDlet-Data-Size をバイト単位で設定することにより、必要な最小データ ストレージ領域を指定する必要があります (MIDlet-Data-Size: 8192 など)。値がモバイル デバイスで指定された最大値を超える場合、アプリケーションは正しくインストールされません。この値は、モバイル デバイスが実際にアプリケーションに提供する最大レコードではありません。 管理 システムのストレージ容量は多くの場合大きくなるため、開発者はアプリケーションに必要な最小ストレージ容量をあまり大きく設定しないようにし、必要に応じて該当するデバイスの取扱説明書を参照する必要があります。不揮発性ストレージ領域でのデータの読み取りと書き込みは低速であることが多いため、頻繁にアクセスされるデータのパフォーマンスを向上させるキャッシュ メカニズムを提供することが最善です。記録 管理システムの読み取りおよび書き込み操作はスレッドセーフですが、レコード ストアは MIDlet 全体によって制御されるため、 スイートは共有されるため、異なる MIDlet で実行されているスレッドがレコード ストアを操作する場合は、データの損傷を避けるために必要なスレッドの同期を実行する必要があります。

MIDP1.0、MIDP2.0での記録について 管理システムの実装は多少異なります。同じ MIDlet スイート内の MIDlet は相互にレコードにアクセスできます。 店。ただし、MIDP1.0 の実装では、異なる MIDlet スイート間でレコードを共有するための規定はありません。 ストアメカニズム。 MIDP2.0 では、異なる MIDlet スイート間でのレコードの共有の問題を解決するために、新しい API が提供されています。 Store の問題については、Record Store を作成する際、共有メカニズムは認証モードと読み書き制御パラメーターによって管理されます。これについては、次の記事で詳しく紹介します。

記録を強化する 管理 システムを理解する最良の方法は、実際の開発を実行することです。開発中に、モバイル デバイスのすべての MIDP 実装が正確であるわけではないことがわかりました。 getSizeAvaliable() メソッドを使用して Nokia6108 の利用可能なレコードをクエリするとき Storeスペースを使用したときに取得した値は1Mバイト以上でしたが、40Kのデータを書き込んだときにRecordStoreFullException例外が発生したため、自動テスト電話レコードを書き込みました ソフトウェアは最大のストレージ容量に保存してください。原則は、100 ~ 500 ミリ秒などの一定時間ごとにデータを Record に送信することです。 ストアに 1K バイトのデータを書き込みます。ストレージ領域がいっぱいであるという例外がスローされた場合、最大値を取得できます。正確な単位は K バイトです。以下はプログラムのソース コードと JAD ファイルの内容です。開発プラットフォームは Eclipse3.0RC2+EclipseME0.4.1+Wtk2.1+J2SDK1.4.2._03 であり、実際の Nokia 6108 でテストに合格したことがわかります。最大値は 31K です。 (シミュレーターでのテストは行わないでください。そうしないと結果が無意味になります)

要約: この記事は読者を記録に導くだけです 管理システムについては一般的に理解できますが、アプリケーションについては記事の最後に記載されています。しかし、Record の使用方法に関する詳細な分析はありません。 管理 システム。次の記事では、RecordStore クラスの使用方法に焦点を当てて、javax.microedition.rms パッケージ内のクラスを詳しく分析します。

import javax.microedition.lcdui.Alert;

import javax.microedition.lcdui.AlertType;

import javax.microedition.lcdui.Display;

import javax.microedition.midlet.MIDlet;

import javax.microedition .midlet.MIDletStateChangeException;

import javax.microedition.rms.RecordStoreException;

  public class RMSAnalyzer extends MIDlet

{

private Display display;

private CounterCanvas counterCanvas;

private Alert alert;

protected void startApp() throws MIDletStateChangeException

{

display = Display.getDisplay(RMSAnalyzer.this) ;

alert = new Alert("错误示唆");

try

{

文字列間隔 = this.getAppProperty("INTER");

int t = Integer.parseInt(interval);

counterCanvas = new CounterCanvas(t, 1, this);

}

catch (RecordStoreException e)

{

this.showAlertError(e.getMessage());

display.setCurrent(counterCan vas);

}

public Display getDisplay()

{

return display;

}

protected void stopApp()

{

}

protected void destroyApp (boolean arg0) MIDletStateChangeExceptionをスローします

{

}

public void showAlertError(String message)

{

alert.setString(message);

alert.setType(AlertType.ERROR);

alert.setTimeout(3000);

dis play.setCurrent(alert);

}

}

import java.util.Timer;

import java.util.TimerTask;

import javax.microedition.lcdui.Canvas;

import javax.microedition.lcdui.コマンド;

import javax. microedition.lcdui.CommandListener;

import javax.microedition.lcdui.Displayable;

import javax.microedition.lcdui.Graphics;

import javax.microedition.midlet.MIDletStateChangeException;

import .microedition.rms.*;

public class CounterCanvas extends Canvasimplements CommandListener

{

private RMSModel model;

private RMSAnalyzer RMSanalyzer;

private int interTime;

private int counter;

private boolean go = true;

public static Command backCommand = new Command("退出", Command.EXIT, 3);

public staticfinal int INC = 1;

publicfinal Timer timer = new Timer();

public CounterCanvas(int interTime, int Base, RMSAnalyzer rmsa )

RecordStoreExceptionをスローします

{

this.interTime = interTime;

this.counter = base;

this.RMSanalyzer = rmsa;

model = new RMSModel(base, RMSanalyzer) ;

this.addCommand( backCommand);

this.setCommandListener(this);

TimerTask timerTask = new TimerTask()

{

public void run()

{

try

{

model.writeRecord(INC);

counter++;

} catch (RecordStoreFullException e)

{

go = false;

model.deleteRMS();

timer.cancel();

} catch (RecordStoreException e)

{

モデル.deleteRMS();

RMSanalyzer.showAlertError(e.getMessage());

timer.cancel();

}

repaint();

}

};

timer.schedule(timerTask, 1000, interTime);

}

public void setCounter(int counter)

{

this.counter = counter;

}

public void setInterTime(int interTime)

{

this.interTime = interTime ;

}

protected void Paint(Graphics arg0)

{

int SCREEN_WIDTH = this.getWidth();

int SCREEN_HEIGHT = this.getHeight();

arg0 .drawRect(SCREEN_WIDTH / 10, SCREEN_HEIGHT / 2,

SCREEN_WIDTH * 4 / 5, 10);

if(RMSanalyzer.getDisplay().isColor())

{

arg0.setColor(128, 128, 255);

}

arg0。 fillRect(SCREEN_WIDTH / 10, SCREEN_HEIGHT / 2, counter, 10);

if (!go)

上記は、J2ME 学習 - RMS の入門から習熟までの内容です。その他の関連コンテンツについては、PHP 中国語 Web サイト (www.php.cn) をご覧ください。


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。