Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 每个套接字(UDP)接收数据包时,主线程冻结_Java_Android_Sockets - Fatal编程技术网

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,这里有一个相关问题: