监听器中的PrintWriter崩溃了应用程序

时间:2018-05-16 18:21:29

标签: android tcp arduino crash printwriter

我想创建一个非常简单的TCP / IP客户端服务器,其中Android设备是客户端,Arduino是服务器。

所以这是我的代码:

public class MainActivity extends AppCompatActivity {

    private Socket socket;

    private static final int SERVERPORT = 80;
    private static final String SERVER_IP = "192.168.1.141";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        new Thread(new ClientThread()).start();
    }

    public void onClick(View view){
        try {
            TextInputLayout input1 = (TextInputLayout) findViewById(R.id.input1);
            String str = input1.getEditText().getText().toString();

            PrintWriter out = new PrintWriter(this.socket.getOutputStream(), true);
            out.println(this.socket.getInetAddress().toString());
            out.flush();

        }
        catch(IOException e) {
            e.printStackTrace();
        }
    }

    class ClientThread implements Runnable{
        @Override
        public void run(){
            try{
                InetAddress serverAddr = InetAddress.getByName(SERVER_IP);
                socket = new Socket(serverAddr, SERVERPORT);
            }
            catch(UnknownHostException e1){
                e1.printStackTrace();
            }
            catch(IOException e2){
                e2.printStackTrace();
            }
        }
    }
}    

当我启动应用程序时,手机设法连接到服务器(我可以从Arduino的串行监视器中看到它),但是当我点击按钮时,它可能因为PrintWriter类而崩溃。

奇怪的是,如果我从ClientThread类中的run()方法打印一条消息,那么就会发送消息。

奇怪的是,当我通过Android Studio模拟器运行它时,应用程序不会崩溃,但它会在真实设备上运行。

问题源于onClick侦听器和PrintWriter的组合,但我只是不明白为什么。

2 个答案:

答案 0 :(得分:0)

好吧,崩溃可能源于这样一个事实,即在无法建立与服务器的连接的情况下,当它为空时,您尝试访问socket变量。这种情况的确切原因可以在日志中找到(网络问题,安全问题等等)。

答案 1 :(得分:0)

解决方案是我需要从另一个Thread打印到套接字。