news 2026/5/26 5:01:58

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/24 12:50:10

PinWin:让窗口置顶成为你的效率倍增器

PinWin&#xff1a;让窗口置顶成为你的效率倍增器 【免费下载链接】pinwin .NET clone of DeskPins software 项目地址: https://gitcode.com/gh_mirrors/pi/pinwin 还在为窗口切换频繁打断工作节奏而苦恼吗&#xff1f;想要重要信息始终保持在视线范围内&#xff1f;Pi…

作者头像 李华
网站建设 2026/5/22 23:04:30

终极Mac菜单栏清理指南:用Dozer隐藏图标让桌面更整洁

终极Mac菜单栏清理指南&#xff1a;用Dozer隐藏图标让桌面更整洁 【免费下载链接】Dozer Hide menu bar icons on macOS 项目地址: https://gitcode.com/gh_mirrors/do/Dozer 还在为MacBook菜单栏上拥挤的图标感到烦恼吗&#xff1f;想要一个干净清爽的工作界面&#xf…

作者头像 李华
网站建设 2026/5/20 22:54:45

RocketMQ-Flink 终极实战指南:从零构建企业级实时数据管道

RocketMQ-Flink 终极实战指南&#xff1a;从零构建企业级实时数据管道 【免费下载链接】rocketmq-flink RocketMQ integration for Apache Flink. This module includes the RocketMQ source and sink that allows a flink job to either write messages into a topic or read …

作者头像 李华
网站建设 2026/5/26 16:47:53

免疫细胞去卷积分析5大核心策略:从理论到实战的完整指南

免疫细胞去卷积分析5大核心策略&#xff1a;从理论到实战的完整指南 【免费下载链接】immunedeconv 项目地址: https://gitcode.com/gh_mirrors/imm/immunedeconv 免疫细胞去卷积技术正在彻底改变我们对肿瘤微环境的理解方式。面对混合样本中细胞比例难以直接观察的困境…

作者头像 李华
网站建设 2026/5/23 22:52:27

39、高效实践:成为技能大师的秘诀

高效实践:成为技能大师的秘诀 实践若想有所回报,就需要兼具有效性和高效性。从表面上看,高效实践的过程很简单,只需接收挑战、尝试完成挑战(通常是回答问题),然后评估自己的掌握程度即可。然而,实践本身是一项复杂的技能,下面为大家提供一些通用的建议。 1. 合理安排…

作者头像 李华