Java 每个套接字(UDP)接收数据包时,主线程冻结
一个简单的测试设置:我故意等待一个Java 每个套接字(UDP)接收数据包时,主线程冻结,java,android,sockets,Java,Android,Sockets,一个简单的测试设置:我故意等待一个数据包,它永远不会到达,因为没有对应的套接字应答。但是它冻结了用户界面,并且它在LocalService中的一个单独线程上运行 如果socket.receive(paket);…}已删除 这里,BackgroundService中的run()扩展了服务{……类ClientSocketThread扩展了线程{……run()…}} @Override public void run() { Process.setThreadPriority(
数据包
,它永远不会到达,因为没有对应的套接字应答。但是它冻结了用户界面,并且它在LocalService
中的一个单独线程上运行如果
socket.receive(paket);…}代码>已删除
这里,BackgroundService中的run()
扩展了服务{……类ClientSocketThread扩展了线程{……run()…}}
@Override
public void run() {
Process.setThreadPriority(Process.THREAD_PRIORITY_DEFAULT);
try {
String stringSend = "hello from ClientSocketThread";
buffer = stringSend.getBytes();
packet.setData(buffer); //on init its empty
socket.send(packet);
socket.receive(packet);
String received = new String(packet.getData(), 0, packet.getLength());
Log.e("BackgroundService ", "received "+received);
} catch (Exception e) {
Log.e("BackgroundService ", "ClientSocketThread");
Log.e("BackgroundService", e.toString());
}
}
安卓显示器说
链接到。有趣的是:
- waiting to lock <0x41ed80a8> (a java.net.DatagramSocket) held by tid=13 (Thread-4376)
-等待由tid=13(线程-4376)持有的锁(java.net.DatagramSocket)
ADDON我现在添加了一个socket.setSortimeout(3000)
并注意到UI并没有在3秒钟内准确更新。有人能解释一下原因吗?我以前认为:
我假设线程-4376
正在阻塞CPU,因为它一直在等待
因为未设置任何socket.setSoTimeout(时间)
,所以无法发送数据包。
因此,main
无法访问CPU以更新trows的UI
安尔。是这样吗
我想这是错误的。我确实为UI线程创建了某种类型的锁,并让他等待,但让它自行决定。我选择了不同的方法并考虑:
- 不要扩展线程,而是使用
Runnable
,即实现任务的代码片段,并将其放入新线程中:
Thread t1 = new Thread(new SocketRunnable(ints, sleep));
- 像我以前那样修改UI线程策略是不可取的。在Android中,默认情况下禁用UI线程上的网络操作。当我需要标记时,代码与UI线程有一些连接,我最终可以删除它,成功
您还可以共享启动此线程的代码和初始化UDP套接字的代码吗?感谢您提供的任何帮助:可能会被阻止,来自文档:API级别1中添加的公共同步无效接收(DatagramPacket pack)从该套接字接收数据包并将其存储在参数包中。必须根据接收到的数据设置包的所有字段。如果接收到的数据长于数据包缓冲区大小,则会将其截断。此方法会一直阻止,直到收到数据包或超时过期。在客户端的Android Mobile上启动本机线程不是一个很好的做法。。。。。检查Android为该类型作业提供的异步任务的解决方案,或者您可以使用您想要的任何其他java并发框架。对于AsyncTask,这里有一个相关问题: