AsynkThread 但仍然是 NetworkOnMainThreadException
AsynkThread but still NetworkOnMainThreadException
我尝试在我的 android 设备和 arduino nano 之间建立连接。
我测试了 raspberry pi zero 和我的 arduino 之间的 TCP 连接,它可以正常工作并完成它应该做的事情。
现在我尝试编写 android 应用程序,但它抛出了
android.io.NetworkOnMainThreadException
我发现了一些使用 AsynkTask 来完成它的提示,但它仍然抛出这个异常。我找到了一些解决方案,但对我的情况都没有帮助(例如:将 minAPI 设置为 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);
}
}
}
}
我做错了什么?感谢您的帮助。
onPreExecute 和 onPostExecute 方法在主线程上运行,因此,sendData 方法应该在 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);
}
}
}
我尝试在我的 android 设备和 arduino nano 之间建立连接。
我测试了 raspberry pi zero 和我的 arduino 之间的 TCP 连接,它可以正常工作并完成它应该做的事情。
现在我尝试编写 android 应用程序,但它抛出了
android.io.NetworkOnMainThreadException
我发现了一些使用 AsynkTask 来完成它的提示,但它仍然抛出这个异常。我找到了一些解决方案,但对我的情况都没有帮助(例如:将 minAPI 设置为 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);
}
}
}
}
我做错了什么?感谢您的帮助。
onPreExecute 和 onPostExecute 方法在主线程上运行,因此,sendData 方法应该在 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);
}
}
}