Приложение Java-ME в режиме заморозки - PullRequest
1 голос
/ 05 ноября 2011

Я занимаюсь разработкой мобильного приложения на основе Java-ME.Теперь мои требования такие же, как когда я обновляю один из моих RMS, я хочу, чтобы мое приложение оставалось в режиме заморозки;что означает, что никакое другое действие, такое как нажатие кнопки или что-либо еще, не должно происходить.Мой метод уже "Синхронизирован".

Пожалуйста, помогите мне с этим вопросом.

Спасибо.

Ответы [ 3 ]

1 голос
/ 05 ноября 2011

Лучший способ справиться с этим - это «сериализовать» ваши задачи.Вы можете сделать это с помощью очереди сообщений - класса, который поддерживает 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
        }
    }
}
0 голосов
/ 05 ноября 2011

Я хочу, чтобы мое приложение оставалось в режиме заморозки;это означает, что никакие другие действия, такие как нажатие кнопки или что-либо еще, не должны происходить.

Прежде всего, я настоятельно рекомендую не допустить реального замораживания пользовательского интерфейса - это может привести к самоубийству пользователя в вашем приложении.

Если вы когда-либо сидели перед компьютером, застыв из-за какой-то программной ошибки, вы можете понять, почему такой подход настоятельно не рекомендуется.Как они описывают это в руководстве по потоковой обработке MIDP , «пользовательский интерфейс зависает, устройство кажется мертвым, а пользователь разочарован ...»

Кстати, в этом руководстве также предлагаетсяпростейшее решение таких проблем, как вы описываете: отображение экрана ожидания .Если у вас нет причин избегать этого решения, просто сделайте так, как предлагает учебник.

Чтобы быть в безопасности, рассмотрите сериализацию задач, как предложено в другом ответе .Это обеспечит, что при запуске обновления службы управления правами другие задачи не будут отложены.

0 голосов
/ 05 ноября 2011

То, что вы спрашиваете, зависит от кода. Обычно, когда вы хотите сделать какие-то синхронные действия, вы просто пишете их одно за другим. в Java это более завершено, поскольку иногда вы «просите» систему сделать что-то (например, метод repaint ()). Но так как операции чтения / записи RMS очень быстрые (несколько миллисекунд), я не вижу необходимости в освобождении.

Не могли бы вы предоставить дополнительную информацию о необходимости (время для ответа RMS)? Ваш код работает в системном потоке (основной поток) или в вашем собственном потоке?

...