这个问题在这里已经有了答案:
How can I fix 'android.os.NetworkOnMainThreadException'?
(66 个回答)
6年前关闭。
我正在尝试创建一个简单的应用程序,它将接收来自 WiFi 模块的 UDP 数据包。 WiFi模块每5秒发送一个数据包,但我一直无法成功接收。
使用 toasts 作为调试的一种方式,我以正确的顺序收到它们,直到“这里也没有得到它”,这告诉我问题出在 'socket.receive(packet)' 行。
有没有人知道为什么它可能不起作用?我还通过在线查看大量问题/示例尝试了代码的变体,但它们仍然会导致“socket.receive(packet)”行出现问题。
另外,我写了一个python脚本来做同样的事情,在同一个端口上寻找UDP数据包,并用QPython运行它,它确实收到了数据包,所以看起来数据包是由WiFi模块发送的,并且接收到了通过平板电脑,只是应用程序由于某种原因不会读取数据。
任何帮助或见解将不胜感激,谢谢。
这是代码:
public void run() {
Toast.makeText(this, "RIGHT BEFORE TRY", Toast.LENGTH_LONG).show();
DatagramSocket socket;
DatagramPacket packet;
try {
Toast.makeText(this, "IN THE TRY", Toast.LENGTH _LONG).show();
socket = new DatagramSocket(9750);
byte[] buf = new byte[1024]; //buffer
socket.setSoTimeout(100000);
Toast.makeText(this, "Timeout is: " + socket.getSoTimeout(), Toast.LENGTH_LONG).show();
//DatagramPacket packet = new DatagaramPacket(buf, buf.length);
//Toast.makeText(this, "PACKET SIZE IS: "+buf.length, Toast.LENGTH_LONG).show();
// while(true) {
Toast.makeText(this, "IN THE WILD!", Toast.LENGTH_LONG).show();
packet = new DatagramPacket(buf, buf.length);
Toast.makeText(this, "PACKET SIZE IS: " + buf.length, Toast.LENGTH_LONG).show();
try {
//socket.receive(packet);
socket.receive(packet);
Toast.makeText(this, "GOT SOMETHING!", Toast.LENGTH_LONG).show();
}
catch (Exception i) {
// TODO Auto-generated catch block
//i.printStackTrace();
Toast.makeText(this, "DIDN'T GET IT HERE EITHER!", Toast.LENGTH_LONG).show();
}
//byte[] result = new byte[packet.getLength()];
byte[] result = packet.getData();
System.arraycopy(packet.getData(), 0, result, 0, packet.getLength());
String msg = new String(result);
Toast.makeText(this, msg, Toast.LENGTH_LONG).show();
Toast.makeText(this, "END WHILE!", Toast.LENGTH_LONG).show();
//}
} catch (Exception e) {
// TODO Auto-generated catch block
//e.printStackTrace();
Toast.makeText(this, "DIDN'T GET IT!", Toast.LENGTH_LONG).show();
}
}
更新:在前两个答案之后,看起来我们试图在主线程中进行网络操作,这是不可行的,所以我们目前正在尝试用另一个线程或异步任务来实现它。希望有一些好消息:)
最佳答案
正如您所说,有 NetworkOnMainThread 异常,您只需将此问题放在新线程上并启动它...
Thread thread = new Thread() {
@Override
public void run() {
Toast.makeText(this, "RIGHT BEFORE TRY", Toast.LENGTH_LONG).show();
DatagramSocket socket;
DatagramPacket packet;
try {
Toast.makeText(this, "IN THE TRY", Toast.LENGTH _LONG).show();
socket = new DatagramSocket(9750);
byte[] buf = new byte[1024]; //buffer
socket.setSoTimeout(100000);
Toast.makeText(this, "Timeout is: " + socket.getSoTimeout(), Toast.LENGTH_LONG).show();
//DatagramPacket packet = new DatagaramPacket(buf, buf.length);
//Toast.makeText(this, "PACKET SIZE IS: "+buf.length, Toast.LENGTH_LONG).show();
// while(true) {
Toast.makeText(this, "IN THE WILD!", Toast.LENGTH_LONG).show();
packet = new DatagramPacket(buf, buf.length);
Toast.makeText(this, "PACKET SIZE IS: " + buf.length, Toast.LENGTH_LONG).show();
try {
//socket.receive(packet);
socket.receive(packet);
Toast.makeText(this, "GOT SOMETHING!", Toast.LENGTH_LONG).show();
}
catch (Exception i) {
// TODO Auto-generated catch block
//i.printStackTrace();
Toast.makeText(this, "DIDN'T GET IT HERE EITHER!", Toast.LENGTH_LONG).show();
}
//byte[] result = new byte[packet.getLength()];
byte[] result = packet.getData();
System.arraycopy(packet.getData(), 0, result, 0, packet.getLength());
String msg = new String(result);
Toast.makeText(this, msg, Toast.LENGTH_LONG).show();
Toast.makeText(this, "END WHILE!", Toast.LENGTH_LONG).show();
//}
} catch (Exception e) {
// TODO Auto-generated catch block
//e.printStackTrace();
Toast.makeText(this, "DIDN'T GET IT!", Toast.LENGTH_LONG).show();
}
}
};
thread.start();
关于java - 为什么我的简单应用程序没有收到 UDP 数据包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30403639/