major024 major024 - 1 year ago 35
Android Question

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.

Answer Source

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);
            }
        }
    }
Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download