我的客户端代码使我的Android应用程序崩溃

问题描述 投票:0回答:2

所以我有这个我在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),服务器似乎都收到了数据,并发送了正确的答案。

java android java.util.scanner outputstream datainputstream
2个回答
0
投票

您不能在同一个线程中同时拥有网络I / O和UI操作,例如TextView#setText()。尝试在UI线程上执行网络I / O会导致NetworkOnMainThreadException。尝试在非UI线程上执行UI操作会导致CalledFromWrongThreadException。猜猜你的代码正在崩溃其中一个。

有一些先进的线程机制,如rxjava调度程序或kotlin协同程序。如果不添加额外的库依赖项,您可以尝试将网络代码移动到AsyncTask

也可以看看:

How do I fix android.os.NetworkOnMainThreadException?

Unfortunately MyApp has stopped. How can I solve this?


0
投票

完成后关闭或刷新输出流。我认为这会导致内存泄漏

© www.soinside.com 2019 - 2024. All rights reserved.