在android中接收UDP数据包
我正在为android开发一个P2P聊天/共享应用程序。以下代码用于接收UDP数据包,但仅接收并显示第一条消息/数据包。(发送代码没有问题。)随后的聊天信息不会显示。while循环似乎在chathistory.setText(新字符串…)执行后退出。例如:chathistory.setText(“test”);未执行。有人能指出错误吗?没有引发异常在android中接收UDP数据包,android,networking,udp,chat,datagram,Android,Networking,Udp,Chat,Datagram,我正在为android开发一个P2P聊天/共享应用程序。以下代码用于接收UDP数据包,但仅接收并显示第一条消息/数据包。(发送代码没有问题。)随后的聊天信息不会显示。while循环似乎在chathistory.setText(新字符串…)执行后退出。例如:chathistory.setText(“test”);未执行。有人能指出错误吗?没有引发异常 public void receive() throws Exception { (new Thread(new R
public void receive() throws Exception
{
(new Thread(new Runnable() {
@Override
public void run() {
try
{
ds1=new DatagramSocket(7777);
//chathistory.setText("Holding the port...");
while(true)
{
DatagramPacket p = new DatagramPacket(buffer, buffer.length);
ds1.receive(p);
chathistory.setText(new String(p.getData(), 0, p.getLength()));
chathistory.setText("test");
}
}
catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} })).start();
}
首先,Androids的UI调用都不是线程安全的,而且由于您的进程主线程用于更新UI,因此您永远不应该从任何其他线程操作Android中的UI元素,但您的活动正在运行的线程除外 第二,您可能会抛出异常,因为logcat无法从另一个线程打印
第三,我很好奇这段代码是否曾试图强行关闭你,我之所以这么问是因为我很好奇,如果.receive被阻塞很长时间,android会怎么做,你可能应该使用超时。
e.printStackTrace()
不会显示在logcat中,因此您可能会丢失一个异常。请将该行替换为抛出新的RuntimeException(e)
,以便在异常发生时将其显示出来。谢谢。我必须使用处理程序来操作UI元素。无论如何,现在我的应用程序只能在单个访问点上运行,例如192.168.1.255(我可以使用dhcpinfo生成广播地址)。由于android不接收255.255.255.255广播的数据包,您知道我如何使用扩展BSS配置发现连接到同一LAN上其他接入点的android设备吗?(我为离题道歉,但我的问题在另一篇帖子上没有得到回答&我真的非常想知道。)