Мой код клиента приводит к сбою приложения для Android - PullRequest
0 голосов
/ 06 марта 2019

Итак, у меня есть этот код клиента, который я тестировал в eclipse, и он работает там

try {
            // Establish connection
            Socket socket = new Socket(InetAddress.getByName("192.168.1.104"), 9000);

            // Request data
            OutputStream outputStream = socket.getOutputStream();
            InputStream inputStream = socket.getInputStream();

            msg = "IDGN:" + "1";
            System.out.println(msg);

            outputStream.write(msg.getBytes());
            socket.shutdownOutput();
            scanner = new DataInputStream(inputStream);
            restaurante = scanner.readUTF();
            System.out.println(restaurante);

            // Shut down socket
            socket.shutdownInput();
            socket.close();
    } catch (IOException io) {
        io.printStackTrace();
    }

Но когда я пытаюсь сделать то же самое в моем приложении для Android, происходит сбой

try {
                    // Establish connection
                    Socket socket = new Socket(InetAddress.getByName("192.168.1.104"), 9000);

                    // Request data
                    OutputStream outputStream = socket.getOutputStream();
                    InputStream inputStream = socket.getInputStream();

                    msg = "IDGN:" + "1";
                    outputStream.write(msg.getBytes());
                    socket.shutdownOutput();

                    scanner = new DataInputStream(inputStream);
                    restaurante = scanner.readUTF();

                    View b = findViewById(R.id.texto);
                    b.setVisibility(View.VISIBLE);
                    String ss = "Valore el servicio recibido en: " + restaurante;
                    ((TextView) b).setText(ss);

                    // Shut down socket
                    socket.shutdownInput();
                    socket.close();
                }catch (IOException io) {
                    io.printStackTrace();
                }

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

Сервер, похоже, получает штраф в обоих случаях (Android и Eclipse) и отправляет правильный ответ.

Ответы [ 2 ]

0 голосов
/ 06 марта 2019

Вы не можете использовать операции сетевого ввода-вывода и пользовательского интерфейса, например TextView#setText(), в одном потоке. Попытка выполнить сетевой ввод-вывод в потоке пользовательского интерфейса приводит к NetworkOnMainThreadException. Попытка выполнения операций пользовательского интерфейса в потоке не из пользовательского интерфейса приводит к CalledFromWrongThreadException. Похоже, ваш код падает на одном из них.

Существует несколько продвинутых механизмов для создания потоков, таких как планировщики rxjava или сопрограммы kotlin. Без добавления дополнительных библиотечных зависимостей вы можете поэкспериментировать с переносом сетевого кода в AsyncTask.

Смотри также:

Как исправить android.os.NetworkOnMainThreadException?

К сожалению, MyApp остановился. Как я могу решить это?

0 голосов
/ 06 марта 2019

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

...