Получение пакетов UDP в Android - PullRequest
0 голосов
/ 15 октября 2011

Я разрабатываю приложение для чата и обмена P2P для Android. Следующий код предназначен для приема пакета UDP, но только первое сообщение / пакет принимается и отображается. (В коде отправки нет проблем.) Последующие сообщения чата не отображаются. Кажется, что цикл while завершается после того, как chathistory.setText (новая строка .... выполнено. Например: chathistory.setText ("test"); не выполняется. Может кто-нибудь указать на ошибку? Не сгенерировано исключение.

public void receive() throws Exception
        {
        (new Thread(new Runnable() {

        @Override
        public void run() {
            try 
            {
                ds1=new DatagramSocket(7777);
                //chathistory.setText("Holding the port...");

                while(true)
                {

                    DatagramPacket p = new DatagramPacket(buffer, buffer.length);
                    ds1.receive(p);
                    chathistory.setText(new String(p.getData(), 0, p.getLength()));
                    chathistory.setText("test");

                }
            }
                    catch (Exception e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
        }   

        } })).start();
    }

1 Ответ

0 голосов
/ 16 октября 2011

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

Во-вторых, вы можете вызвать исключение, поскольку logcat не может печатать из другого потока.

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

...