当前位置: 首页 > news >正文

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()}}}
http://www.cnnetsun.cn/news/134377.html

相关文章:

  • 安全副业指南:漏洞挖掘 / 技术博客 / 竞赛奖金实战,有什么区别,哪个最赚钱?
  • MathLive 终极指南:2025年最简单上手的网页数学公式编辑器
  • 终极微信助手:6大智能功能让Mac微信更好用
  • 盘搜联盟 一键直达海量资源,全网最强百度网盘搜索神器!
  • 37、高效学习实践:成为学习大师
  • 网页小说自由转换神器:一键打造你的专属离线图书馆
  • 边缘AI如何真正嵌入终端?基于ESP32-S3的软硬件一体化方案详解
  • LoRA vs 全量微调:大模型微调的高效选择指南!大模型微调
  • Jellyfin Kodi插件完整安装配置教程:打造完美家庭影院体验
  • 【期末复习01_02】-结构类算法题
  • Reactor Core性能基准测试深度解析:从原理到实战的性能优化指南
  • KlipperScreen安装终极指南:零基础打造3D打印触摸屏界面
  • 群晖视频信息插件终极配置:高效管理影视库元数据
  • 瞧一瞧原圈科技如何在AI营销内容生产的系统化破局
  • 联想拯救者BIOS高级设置解锁工具完全指南
  • Unity内置着色器完全使用指南
  • 【复现】基于非线性模型预测控制和事件触发通信的AUV编队多智能体协同控制路径跟踪研究附Matlab代码
  • 3分钟玩转树莓派NFC读卡器:MFRC522-python极速上手攻略
  • MuJoCo无头渲染完全指南:告别图形界面的物理仿真可视化
  • 【PCL点云配准】ICP收敛判断
  • Android混合开发终极指南:AgentWeb实现原生与Web的无缝融合
  • 【程序员必学】智能体(Agent)技术:大模型落地的核心载体与应用【收藏指南】
  • 学生综合测评|基于springboot + vue学生综合测评管理系统(源码+数据库+文档)
  • Waydroid完整使用指南:在Linux系统上快速运行Android应用
  • 基于SSM的一线式酒店管理系统-计算机毕业设计源码+LW文档分享
  • 异常处理框架设计:全局异常捕获与统一错误码
  • 批量压缩对象存储中视频
  • ytDownloader视频下载全攻略:从入门到精通的完整指南
  • OPC Data Client+MQTT协议:工业数据连接与传输一体化解决方案
  • 【雷达检测】基于Swerling目标模型的雷达信号检测附Matlab代码和报告