news 2026/5/10 13:19:48

android NDSDManager onResolveFailed errorCode=3的解决方案

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
android NDSDManager onResolveFailed errorCode=3的解决方案

stack overflow有介绍,这个原因可能是系统同时发现了多个

discoveryListener=object:NsdManager.DiscoveryListener{overridefunonServiceFound(service:NsdServiceInfo){onServiceFoundInfo(service)//解析info}....}funonServiceFoundInfo(){//开始解析nsdManager.resolveService(next,object:NsdManager.ResolveListener{overridefunonResolveFailed(serviceInfo:NsdServiceInfo,errorCode:Int){loge(TAG){"Failed to resolve service:${serviceInfo.serviceName}, error:$errorCode"}}overridefunonServiceResolved(serviceInfo:NsdServiceInfo){//解析成功})}

如果你这里直接开始解析,在某些手机上,可能就报错了。告诉你,解析出错,errorCode=3。
因为可能同时有多个onServiceFound过来,同时,resolveService就会出错。

解决办法:串行执行。

这里采用kotlin的suspendCancellableCoroutine + LinkedBlockingQueue解决。

privatevalmResolveQueue=LinkedBlockingQueue<NsdServiceInfo>()privatevalmIsResolving=AtomicBoolean(false)discoveryListener=object:NsdManager.DiscoveryListener{overridefunonServiceFound(service:NsdServiceInfo){onServiceFoundInfo(service)}....}privatefunonServiceFoundInfo(service:NsdServiceInfo){mResolveQueue.offer(service)//内部有锁的processResolveQueue()}privatefunprocessResolveQueue(){if(!mIsResolving.compareAndSet(false,true))returnscope.launch{//子线程while(true){valnext=mResolveQueue.poll()?:breakvalresolved=suspendCancellableCoroutine{cont->try{nsdManager.resolveService(next,object:NsdManager.ResolveListener{overridefunonResolveFailed(serviceInfo:NsdServiceInfo,errorCode:Int){loge(TAG){"Failed to resolve service:${serviceInfo.serviceName}, error:$errorCode"}if(cont.isActive)cont.resume(null)}overridefunonServiceResolved(serviceInfo:NsdServiceInfo){if(cont.isActive)cont.resume(serviceInfo)}})}catch(e:Exception){loge(TAG,e){"Failed to resolve service:${next.serviceName}, error:${e.message}"}if(cont.isActive)(//if(!e.message.isNullOrEmpty()) cont.resumeWithException(e) else cont.resume(null)cont.resume(null)//不做异常抛出)}}if(resolved!=null){handleResolvedService(resolved)//todo 自己的逻辑}}mIsResolving.set(false)if(mResolveQueue.isNotEmpty()){processResolveQueue()}}}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/9 10:29:11

SMT贴片加工厂主要招什么工人

随着电子制造行业的快速发展&#xff0c;SMT贴片加工厂的自动化程度越来越高&#xff0c;但“自动化不等于无人化”。一条完整的 SMT 产线&#xff0c;从准备、生产到检测、维护&#xff0c;都需要不同岗位协同完成。因此&#xff0c;想了解 SMT 工厂如何运转&#xff0c;首先要…

作者头像 李华
网站建设 2026/5/1 9:29:56

终极EspTinyUSB项目指南:如何快速解决ESP32S2 USB开发难题

终极EspTinyUSB项目指南&#xff1a;如何快速解决ESP32S2 USB开发难题 【免费下载链接】EspTinyUSB ESP32S2 native USB library. Implemented few common classes, like MIDI, CDC, HID or DFU (update). 项目地址: https://gitcode.com/gh_mirrors/es/EspTinyUSB EspT…

作者头像 李华
网站建设 2026/5/1 10:56:04

RDA与IPv6部署的协同:北京主题日活动如何加速数据资产安全流通?

【摘要】IPv6作为新一代网络基石&#xff0c;为真实数据资产&#xff08;RDA&#xff09;提供了原生安全、海量编址与高效传输能力&#xff0c;二者协同构筑了数据要素安全流通与价值释放的“数字高速公路”。引言数字经济时代的核心生产要素是数据。然而&#xff0c;数据要从原…

作者头像 李华
网站建设 2026/5/8 20:12:48

密码重置漏洞挖掘指南:从原理到实战的完整路径

密码重置漏洞挖掘指南&#xff1a;从原理到实战的完整路径 前言&#xff1a; 密码重置功能是Web应用中最常见也最核心的环节之一&#xff0c;它直接关系到用户账户的安全。正因为其普遍性和高敏感性&#xff0c;一个细微的逻辑缺陷都可能导致整个账户体系的沦陷。密码重置漏洞…

作者头像 李华
网站建设 2026/5/9 18:25:30

智能自动化工具套件:dify-tool-service 完整指南

智能自动化工具套件&#xff1a;dify-tool-service 完整指南 【免费下载链接】dify-tool-service 为AI带路党Pro视频准备 项目地址: https://gitcode.com/gh_mirrors/di/dify-tool-service 在数字化时代&#xff0c;内容创作和可视化呈现已成为日常工作的重要组成部分。…

作者头像 李华