首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >冻结模式下的Java-ME应用程序

冻结模式下的Java-ME应用程序
EN

Stack Overflow用户
提问于 2011-11-05 13:53:44
回答 3查看 144关注 0票数 1

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

关于这个问题,请指导我。

谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-11-05 22:26:01

处理这个问题的最好方法是“序列化”你的任务。您可以使用消息队列来实现这一点,消息队列是一个维护消息对象(任务)的Vector并根据每条消息运行代码的类。队列在一个线程上运行,该线程连续处理每个任务(消息)。您可以为不同的任务创建一个简单的消息类-读取RMS等。如果您喜欢,一条消息可以是一个包含数字的Integer。添加和检索消息的操作是同步的,但是执行任务的代码不是同步的,并且在一个简单的切换块上运行。序列化任务的好处是您不必担心并发性。下面是我用来做这件事的一个类的一些重要代码。

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2011-11-05 15:12:25

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

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

票数 0
EN

Stack Overflow用户

发布于 2011-11-06 03:29:25

我希望我的应用程序停留在一种冻结的模式中;这意味着不应该发生任何其他动作,如单击按钮或任何其他操作。

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

如果你曾经因为某个编程错误而坐在电脑前冻结,你可能会理解为什么这种方法是强烈不被鼓励的。正如他们在MIDP threading tutorial中描述的那样,“用户界面冻结,设备看起来像死了一样,用户变得沮丧……”

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

为了安全起见,考虑一下serializing tasks as suggested in another answer。这将确保当RMS更新开始时,没有其他任务挂起。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8018455

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档