Команда не работает в отдельном потоке в J2me - PullRequest
0 голосов
/ 25 апреля 2010

Я создаю приложение Bluetooth.

Я создал простой мидлет с командой выхода и создаю поток для поиска службы и обнаружения устройства. При этом он отображает анимированный экран, на котором я добавил родительский commandListener для команды выхода. После успешного подключения оба пользователя представлены приветствиями (текущий экран вызывает родительский метод Display setCurrent для отображения самого себя). На этом экране также есть CommandListener, установленный на родительский. Теперь я хочу добавить еще несколько команд. Я реализовал интерфейс CommandLIstener в этом классе, добавил несколько команд, но команды не работают. Я не знаю что не так. Я даю вам фрагменты кода, чтобы полностью описать мою проблему:

package name
Imports here

public class MyMidlet extends MIDlet implements
CommandListener {

public CommandListener theListener;

public Display theDisplay;
public Command exitCommand;

public MyMidlet() {
    // Retrieve the display for this MIDlet
    //Create the initial screen
}

public void startApp() throws MIDletStateChangeException {
}
public void pauseApp() {
}
public void destroyApp(boolean unconditional) {
}
public void commandAction(Command c, Displayable d) {

    // Determine if the exit command was selected
    if (c == exitCommand) {
        //End application here
        notifyDestroyed();
    } else {
        //Start the new thread here
    }
}
}

Теперь вот код для класса, который вызывается вышеприведенным мидлетом в отдельном потоке;

package here;
imports here
public class MyService implements Runnable, CommandListener {

private MyMidlet parent;
private StreamConnection conn;
private OutputStream output;
private InputStream input;

public Command sendCommand;

private TextField messageToSend
Form form;

public BChatService(boolean isServer, BChatMidlet parent) {
   //some stuff here
this.parent = parent;
}

public void run() {
    //function for showing animation here

try {
input = conn.openInputStream();
output = conn.openOutputStream();
} catch (IOException e) {
displayError("IO Error",
"An error occurred while opening " +
"the input and output streams" +
"(IOException: " + e.getMessage() + ")");
try {
conn.close();
} catch (Exception ex) {
}
return;
}
// Create the Form here when service is discoverd and greets the users


    Command sendCommand = new Command("Send", Command.ITEM, 2);
    exitCommand = new Command("Exit", Command.EXIT, 1);
    form.addCommand(exitCommand);
    form.addCommand(sendCommand);

parent.theDisplay.setCurrent(form);

form.setCommandListener(this);

     public void commandAction(Command c, Displayable d) {
        if (c == exitCommand) {
            // End the game
            parent.destroyApp(true);
            parent.notifyDestroyed();
        }
        if(c == sendCommand)  {
          form.append("SOme text here");

        }

    }
}

Когда я выбираю команду «Отправить», строка не добавляется в форму и команда выхода не работает.

Что может быть причиной этого?

Мне нужно реализовать эту функциональность ... Есть ли другой способ добиться этого?

1 Ответ

0 голосов
/ 30 апреля 2010

Вы уверены, что проблема с командой? Что я знаю, так это то, что вызов openInputStream блокирует всю программу, пока он не получит ответ или не достигнет тайм-аута, даже если вы запускаете их в разных потоках (не знаю почему). Соединение действительно установлено?

...