сетевое соединение j2me - PullRequest
1 голос
/ 14 мая 2009

Я читал во многих местах, что сетевое соединение в приложении j2me должно выполняться в отдельном потоке. Это необходимость или хорошо иметь?

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

Может кто-нибудь подтвердить, пожалуйста?

Edit: Если запуск в отдельном потоке не является необходимостью, может кто-нибудь сказать, почему не работает приведенный ниже простой фрагмент кода?

Наступает этап, когда эмулятор спрашивает: "Можно ли подключиться к сети". Независимо от того, нажимаю ли я «да» или «нет», экран не меняется.


public class Moo extends MIDlet {

    protected void destroyApp(boolean arg0) throws MIDletStateChangeException {
        // TODO Auto-generated method stub

    }

    protected void pauseApp() {
    }

    protected void startApp() throws MIDletStateChangeException {
        Display display = Display.getDisplay(this);
        MyCanvas myCanvas = new MyCanvas();
        display.setCurrent(myCanvas);
        myCanvas.repaint();

    }

    class MyCanvas extends Canvas {

        protected void paint(Graphics graphics) {
            try {
                Image bgImage = Image.createImage(getWidth(), getHeight());

                HttpConnection httpConnection = (HttpConnection) Connector
                        .open("https://stackoverflow.com/content/img/so/logo.png");
                Image image = Image.createImage(httpConnection
                        .openInputStream());
                bgImage.getGraphics().drawImage(image, 0, 0, 0);
                httpConnection.close();

                graphics.drawImage(bgImage, 0, 0, 0);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }

}


Редактировать : Я получил свой ответ для кода здесь .

Редактировать: Я породил отдельный вопрос этого здесь .

Ответы [ 3 ]

2 голосов
/ 14 мая 2009

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

0 голосов
/ 22 августа 2012

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

Это старая статья , но в ней говорится о некоторых проблемах, связанных с сетевым взаимодействием и взаимодействием с пользователем.

0 голосов
/ 14 мая 2009

Я согласен с Шоном, но не обязательно иметь ваше сетевое соединение в отдельном потоке, просто лучшие практики. Я думаю, что это, вероятно, случайно, что соединение работало должным образом после перемещения его в отдельный поток. В любом случае, если вы хотите предоставить пользователю визуальную обратную связь во время соединения (что вы, вероятно, делаете с учетом несоответствия, которое пользователи могут испытывать в мобильной сети), сетевая обработка должна выполняться в отдельном потоке .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...