1

我正在开发一个基于 Java-ME 的移动应用程序。现在我的要求就像每当我更新我的一个 RMS 时,我希望我的应用程序保持在一种冻结模式;这意味着不会发生其他操作,例如单击按钮或其他任何操作。我的方法已经“同步”了。

请就这个问题指导我。

谢谢。

4

3 回答 3

1

处理此问题的最佳方法是“序列化”您的任务。您可以使用消息队列来执行此操作 - 一个维护Vector消息对象(任务)并根据每条消息运行代码的类。队列在一个线程上运行,该线程依次处理每个任务(消息)。Integer您为不同的任务创建一个简单的消息类 - 阅读 RMS 等。如果您愿意,消息可以是一个包含数字的消息。添加和检索消息的操作是同步的,但与任务相比的代码不是同步的,并且运行在一个简单的 switch 块上。序列化任务的好处是您不必担心并发性。这是我用来执行此操作的类中的一些基本代码。

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
        }
    }
}
于 2011-11-05T14:26:00.777 回答
0

你问的是非常依赖代码的。通常,当您想要进行一些同步操作时,您只需一个接一个地编写它们。在java中它更复杂,因为有时你“要求”系统做一些事情(比如 repaint() 方法)。但由于 RMS 读/写操作非常快(几毫秒),我认为不需要释放。

您能否提供更多有关需求的信息(RMS 响应时间)?您的代码是在系统线程(主线程)还是您自己的线程上运行?

于 2011-11-05T07:12:24.763 回答
0

我希望我的应用程序保持冻结模式;这意味着不会发生其他操作,例如单击按钮或其他任何操作。

首先,我强烈建议不要真正冻结 UI - 这可能会给您的应用程序带来自杀式的用户体验。

如果您碰巧因为某些编程错误而坐在计算机前冻结,您可能会理解为什么强烈建议不要使用这种方法。正如他们在MIDP 线程教程中所描述的那样,“用户界面冻结,设备似乎死机了,用户变得沮丧......”

顺便说一句,本教程还为您描述的问题提出了最简单的解决方案:显示等待屏幕。如果您真的没有理由避免使用此解决方案,请按照教程的建议进行操作。

为了安全起见,请考虑按照另一个答案中的建议对任务进行序列化。这将确保当 RMS 更新开始时,没有其他任务挂起。

于 2011-11-05T19:29:25.080 回答