Java-ME ベースのモバイル アプリケーションを開発しています。私の要件は、RMS の 1 つを更新するときはいつでも、アプリケーションをフリーズ モードのままにしておきたいということです。これは、ボタンのクリックなどの他のアクションが発生しないことを意味します。私のメソッドはすでに「同期」されています。
この質問について親切に案内してください。
ありがとう。
これを処理する最善の方法は、タスクを「シリアル化」することです。Vectorこれは、メッセージ キュー(メッセージ オブジェクト (タスク) を保持し、各メッセージに基づいてコードを実行するクラス) を使用して行うことができます。キューは、各タスク (メッセージ) を順番に処理するスレッドで実行されます。さまざまなタスク (RMS の読み取りなど) 用に単純なメッセージ クラスを作成します。メッセージは、必要にInteger応じて数値をラップすることができます。メッセージの追加と取得の操作は同期されますが、タスクを実行するコードは同期されず、単純なスイッチ ブロックで実行されます。タスクをシリアル化する利点は、並行性について心配する必要がないことです。これを行うために使用するクラスの重要なコードの一部を次に示します。
class MessageQueue implements Runnable{
Vector messages;
Thread myThread;
volatile boolean stop;
public void start() {
stop=false;
myThread=new Thread(this);
myThread.start();
}
// add message to queue - this is public
public synchronized void addMessage(Message m) {
messages.addElement(m);
if(stop) {
start();
} else {
// wake the thread
notify();
}
}
// get next message from queue - used by this thread
private synchronized Message nextMessage() {
if(stop) return null;
if(messages.isEmpty()) {
return null;
} else {
Message m=(Message)messages.firstElement();
messages.removeElementAt(0);
return m;
}
}
public void run() {
while (!stop) {
// make thread wait for messages
if (messages.size() == 0) {
synchronized (this) {
try {
wait();
} catch (Exception e) {
}
}
}
if (stop) {
// catch a call to quit
return;
}
processMessage();
}
}
}
// all the tasks are in here
private void processMessage() {
Message m = nextMessage();
switch (m.getType()) {
case Message.TASK1:
// do stuff
break;
case Message.TASK2:
// do other stuff
break;
case Message.TASK3:
// do other other stuff
break;
default: //handle bad message
}
}
}
あなたが求めているのは、コードに大きく依存しています。通常、いくつかのシンクロアクションを作成したい場合は、それらを次々に記述します。Java では、システムに何か (repaint() メソッドなど) を実行するよう「要求」することがあるため、より複雑です。しかし、RMS の読み取り/書き込み操作は非常に高速 (数ミリ秒) であるため、解放する必要はありません。
必要性 (RMS が応答するまでの時間) についてさらに情報を提供していただけますか? コードはシステム スレッド (メイン スレッド) または独自のスレッドで実行されますか?
アプリケーションをフリーズモードのままにしたい。これは、ボタンのクリックなどの他のアクションが発生しないことを意味します。
まず第一に、UI を実際にフリーズしないよう強くお勧めします。これにより、アプリケーションのユーザー エクスペリエンスが自殺的なものになる可能性があります。
なんらかのプログラミング バグが原因でコンピューターがフリーズしたことがある場合は、このようなアプローチが強く推奨されない理由がわかるかもしれません。彼らがMIDP スレッド化チュートリアルで説明しているように、「ユーザー インターフェイスがフリーズし、デバイスが機能していないように見え、ユーザーがイライラする...」
ちなみに、このチュートリアルでは、あなたが説明したような問題のおそらく最も簡単な解決策も提案しています:待機画面を表示します。この解決策を避ける理由が本当にない場合は、チュートリアルで提案されているとおりにしてください。
安全のために、別の回答で提案されているようにタスクをシリアル化することを検討してください。これにより、RMS の更新が開始されたときに、保留中のタスクが他にないことが保証されます。