相关疑难解决方法(0)

NSdManager ResolveListener 错误代码 3:失败已经激活

我在 Android 应用程序中使用 NsdManager 来发现由我开发的另一台设备发布的 NSD 服务。我只在 Android App 上做服务发现(这边不需要服务注册)。网络上同时发布了多个相同类型服务的实例。

我开始使用 Google 提供的示例代码(https://developer.android.com/training/connect-devices-wireless/nsd),但由于同时重复使用同一个解析器对象不止一个,我遇到了致命错误服务解决。然后我发现有几个人建议每次都创建一个新的解析器对象(例如在Listener already in use (Service Discovery) 中)。

我这样做了,致命错误被解决失败错误代码 3 取代,这意味着解决过程处于活动状态。比以前好多了,但只有第一个服务得到解决,其余的都因为这个失败而被忽略了。

然后我发现有人建议对错误代码 3 进行特殊处理,方法是递归地重新发送解析请求,直到它最终被解析(NSNetworkManager.ResolveListener 消息 Android)。

我在 Kotlin 中实现了这个解决方案,它有点工作,但我并不满意,因为:

  1. 我相信我正在创建很多额外的 Resolver 对象,我不确定它们以后是否会被垃圾收集。
  2. 我正在循环重试几次,可能会给设备和网络造成额外和不必要的负担。不确定我是否应该在再次调用服务解析之前添加一个短暂的睡眠。
  3. 如果出现网络问题,程序可能会尝试数千次来解析同一个服务,而不是仅仅放弃解析并等待再次发现该服务。

RxBonjour2 的人提供了一个更复杂和更强大的解决方案,但它太复杂了,我无法遵循它:https : //github.com/mannodermaus/RxBonjour/blob/2.x/rxbonjour-drivers/rxbonjour-driver-nsdmanager /src/main/kotlin/de/mannodermaus/rxbonjour/drivers/nsdmanager/NsdManagerDiscoveryEngine.kt

我对 Google 的官方示例没有正确处理这些问题感到沮丧。nsd_chat 示例使用单个解析器对象,并且在网络上以相同类型发布多个相同类型的服务时失败。

你能提出更好的解决方案吗?或者对我下面的代码有什么改进?

import android.app.Application
import android.content.Context
import android.net.nsd.NsdManager
import android.net.nsd.NsdServiceInfo
import androidx.lifecycle.AndroidViewModel
import timber.log.Timber


class ViewModel(application: Application) : AndroidViewModel(application) {

    // Get application context
    private val myAppContext: Context = getApplication<Application>().applicationContext …
Run Code Online (Sandbox Code Playgroud)

android bonjour zeroconf nsd nsdmanager

5
推荐指数
2
解决办法
1421
查看次数

标签 统计

android ×1

bonjour ×1

nsd ×1

nsdmanager ×1

zeroconf ×1