Java me 冻结模式下的javame应用程序

Java me 冻结模式下的javame应用程序,java-me,rms,Java Me,Rms,我正在开发一个基于JavaME的移动应用程序。现在,我的要求就像每当我更新我的一个RMS时,我希望我的应用程序保持在一种冻结模式;也就是说,不应该发生任何其他操作,比如单击按钮或其他任何操作。我的方法已经“同步” 关于这个问题,请指导我 谢谢。您所问的问题非常依赖于代码。通常,当你想做一些同步动作时,你只是一个接一个地写。在java中,它更为复杂,因为有时您“要求”系统执行某些操作(如repaint()方法)。但是由于RMS读/写操作非常快(几毫秒),我认为没有必要释放 您能否提供更多关于需求的

我正在开发一个基于JavaME的移动应用程序。现在,我的要求就像每当我更新我的一个RMS时,我希望我的应用程序保持在一种冻结模式;也就是说,不应该发生任何其他操作,比如单击按钮或其他任何操作。我的方法已经“同步”

关于这个问题,请指导我


谢谢。

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


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

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


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

处理此问题的最佳方法是“序列化”您的任务。您可以使用消息队列来实现这一点,该类维护消息对象(任务)的
向量
,并基于每条消息运行代码。队列在一个线程上运行,该线程以串行方式处理每个任务(消息)。您可以为不同的任务创建一个简单的消息类-读取RMS等。如果您愿意,消息可以是
整数。添加和检索消息的操作是同步的,但与任务相比,代码是不同步的,并且在一个简单的开关块上运行。序列化任务的好处是不必担心并发性。下面是我用来做这件事的一个类中的一些基本代码

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
        }
    }
}

处理此问题的最佳方法是“序列化”任务。您可以使用消息队列来实现这一点,该类维护消息对象(任务)的
向量
,并基于每条消息运行代码。队列在一个线程上运行,该线程以串行方式处理每个任务(消息)。您可以为不同的任务创建一个简单的消息类-读取RMS等。如果您愿意,消息可以是
整数。添加和检索消息的操作是同步的,但与任务相比,代码是不同步的,并且在一个简单的开关块上运行。序列化任务的好处是不必担心并发性。下面是我用来做这件事的一个类中的一些基本代码

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
        }
    }
}
我希望我的应用程序停留在一种冻结模式;也就是说,不应该发生任何其他操作,比如单击按钮或其他任何操作

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

若你们碰巧坐在电脑前,因为一些编程错误而被冻结,你们可能会理解为什么这样的方法是被强烈劝阻的。正如他们在中所描述的,“用户界面冻结,设备似乎已死亡,用户变得沮丧…”

顺便说一下,本教程还为您描述的问题提供了最简单的解决方案:显示等待屏幕。若你们真的并没有理由避免这个解决方案,那个就按照教程的建议去做吧

为了安全起见,考虑一下。这将确保当RMS更新启动时,没有其他挂起的任务

我希望我的应用程序停留在一种冻结模式;也就是说,不应该发生任何其他操作,比如单击按钮或其他任何操作

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

若你们碰巧坐在电脑前,因为一些编程错误而被冻结,你们可能会理解为什么这样的方法是被强烈劝阻的。正如他们在中所描述的,“用户界面冻结,设备似乎已死亡,用户变得沮丧…”

顺便说一下,本教程还为您描述的问题提供了最简单的解决方案:显示等待屏幕。若你们真的并没有理由避免这个解决方案,那个就按照教程的建议去做吧


为了安全起见,考虑一下。这将确保当RMS更新启动时,没有其他任务等待执行。

感谢您的响应MrWhiteYoo,好的,现在情况就像我有一个名为“abc”的RMS一样。我的应用程序正在根据RMS值执行一些操作,而另一个TimerTask正在定期运行,它会检查服务器的更新,每当有更新的数据可用时,它就会下载新数据并将其添加到RMS“abc”中。因此,我想要的是在TimerTask执行其操作(可能是2-5秒)时冻结应用程序。因此,并发不会发生,不会在RMS“abc”中创建任何不正常的操作,我可以明智地下载新数据并使用它们。感谢您的响应MrWhiteYoo,好的,现在的情况就像我有一个名为“abc”的RMS。我的应用程序正在根据RMS值执行一些操作,而另一个TimerTask正在定期运行,它会检查服务器的更新,每当有更新的数据可用时,它就会下载新数据并将其添加到RMS“abc”中。因此,我想要的是在TimerTask执行其操作(可能是2-5秒)时冻结应用程序。因此,并发不会发生,也不会在RMS“abc”中创建任何不常见的操作,我可以明智地下载新数据并使用它们。