【发布时间】:2013-01-05 03:12:02
【问题描述】:
我正在尝试向服务器发送一个 UDP 数据包以查看它是否在线。我已经制作了一个独立的应用程序来做到这一点,它可以毫无问题地工作,但是当将代码放入应用程序并调用该函数时,它会在实际发送数据包时引发异常。我做了很多研究,我找不到任何原因。我用假IP替换了IP,因为我不想发布实际IP。感谢您的帮助。
import java.io.IOException;
import java.net.*;
import android.app.Activity;
public class CheckStatus extends Activity {
//Check if the server is online
public static boolean check() {
try {
byte[] receiveData = new byte[1024];
InetAddress address = InetAddress.getByName("11.11.11.11");
//create socket
DatagramSocket clientSocket = new DatagramSocket();
//set timeout
clientSocket.setSoTimeout(1000);
//send packet
DatagramPacket p = new DatagramPacket(Integer.toBinaryString(0x0006000000).getBytes(), 5, address, 44462);
clientSocket.send(p);//throws exception here
DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
clientSocket.receive(receivePacket);
clientSocket.close();
return true;
} catch (Exception e) {
return false;
}
}
}
打印异常时我得到“android.os.NetworkOnMainThreadException”
【问题讨论】:
-
您正在捕获异常但没有打印出堆栈跟踪...您应该如何知道出了什么问题?
-
是的,很抱歉应该这样做......我再次运行它并得到了这个“android.os.NetworkOnMainThreadException”
-
简单:自 3.0+ 起,Android 不再在其主 (UI) 线程上进行网络连接。考虑使用单独的线程。不是那么简单:您想从静态方法返回一个值。从线程中获取结果并不是最简单的任务。 如果您将结果发布到 UI,这会更容易(通过 AsyncTask)。