我正在开发基于Java-ME的移动应用程序。现在我的要求就像每次更新我的RMS时,我希望我的应用程序保持Freeze模式;这意味着没有其他动作,如点击按钮或其他任何事情应该发生。我的方法已经“同步”了。
请指导我这个问题。
感谢。
答案 0 :(得分: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
}
}
}
答案 1 :(得分:0)
您所要求的是非常依赖代码的。通常当你想做一些同步动作时,你只需要一个接一个地写它们。在java中它更加复杂,因为有时候你“要求”系统做某事(比如repaint()方法)。但由于RMS读/写操作非常快(几毫秒),因此我认为没有必要进行释放。
请您提供更多有关需求的信息(RMS回复的时间)?您的代码是在系统线程(主线程)还是您自己的线程上运行?
答案 2 :(得分:0)
我希望我的应用程序保持Freeze模式;这意味着没有其他动作,如点击按钮或其他任何事情都应该发生。
首先,我强烈建议不要真正冻结用户界面 - 这可能会为您的应用程序带来自杀用户体验。
如果你碰巧因为某些编程错误而坐在电脑前冻结,你可能会理解为什么这样的方法被强烈劝阻。正如他们在MIDP threading tutorial中描述的那样,“用户界面冻结,设备似乎已经死亡,用户变得沮丧......”
顺便提一下,本教程还为您描述的问题提供了最简单的解决方案:显示等待屏幕。如果您没有理由避免使用此解决方案,请按照教程的建议进行操作。
为安全起见,请考虑serializing tasks as suggested in another answer。这将确保在RMS更新开始时,没有其他待处理的任务。