Search code examples
androidandroid-asynctasknetworkonmainthread

AsynkThread but still NetworkOnMainThreadException


I try to build up a connection between my android device and an arduino nano.

I tested the TCP connection between an raspberry pi zero and my arduino and it works and does what it is supposed to do.

Now i try to write the android app, but it throws the

android.io.NetworkOnMainThreadException

I found some hints to do it with AsynkTask but it still throws this exception. I found some solutions but neither did help in my case (eg: setting minAPI to 11).

public class MainActivity extends AppCompatActivity {

    [...]

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        [...]

        bt1.setOnClickListener(new View.OnClickListener(){
            public void onClick(View v) {
                onBtnClick();
            }
        }
    }

    public void onBtnClick() {
        new Client().execute("0101010101");
    }



    private class Client extends AsyncTask<String, Void, String> {
        protected String doInBackground(String[] params) {
            // do above Server call here
            return "null";
        }

        protected void onPostExecute(String msg) {
            String reply ="";
            try {
                reply=sendData();
            } catch(IOException e) {
                e.printStackTrace();
                reply = "IOException: "+e;
            }
            txt1.setText(reply);
        }
        public String sendData() throws IOException{

            try {
                // send message to Arduino
                InetAddress serverAddr = InetAddress.getByName(ipAddress);
                DatagramSocket clientSocket = new DatagramSocket();

                send_data = str.getBytes();
                DatagramPacket sendPacket = new DatagramPacket(send_data, send_data.length, serverAddr, portNumber);
                clientSocket.send(sendPacket);

                // get reply
                byte[] receiveData1 = new byte[512];
                DatagramPacket receivePacket = new DatagramPacket(receiveData1, receiveData1.length);
                clientSocket.receive(receivePacket);

                String reply = new String(receiveData1);
                clientSocket.close();
                return reply;

            } catch (Exception e) {
                e.printStackTrace();
                return("Exception: "+ e);
            }
        }
    }
}

What am i doing wrong? Thank you for your help.


Solution

  • The methods onPreExecute and onPostExecute runs on main thread, so, the method sendData should be executed on doInBackground

    private class Client extends AsyncTask<String, Void, String> {
            protected String doInBackground(String[] params) {
                String reply ="";
                try {
                    reply=sendData();
                } catch(IOException e) {
                    e.printStackTrace();
                    reply = "IOException: "+e;
                }
            }
    
            protected void onPostExecute(String msg) {
                txt1.setText(reply);
            }
            public String sendData() throws IOException{
    
                try {
                    // send message to Arduino
                    InetAddress serverAddr = InetAddress.getByName(ipAddress);
                    DatagramSocket clientSocket = new DatagramSocket();
    
                    send_data = str.getBytes();
                    DatagramPacket sendPacket = new DatagramPacket(send_data, send_data.length, serverAddr, portNumber);
                    clientSocket.send(sendPacket);
    
                    // get reply
                    byte[] receiveData1 = new byte[512];
                    DatagramPacket receivePacket = new DatagramPacket(receiveData1, receiveData1.length);
                    clientSocket.receive(receivePacket);
    
                    String reply = new String(receiveData1);
                    clientSocket.close();
                    return reply;
    
                } catch (Exception e) {
                    e.printStackTrace();
                    return("Exception: "+ e);
                }
            }
        }