Android NSD-永久挂起/运行-特定于设备?

Android NSD-永久挂起/运行-特定于设备?,android,bonjour,mdns,dns-sd,nsd,Android,Bonjour,Mdns,Dns Sd,Nsd,我正试图在我公司的专有硬件设备上执行服务发现,该设备拥有自己的WiFi网络,并通过该网络宣传“你好”服务。当我连接到WiFi网络时,我正在使用NSD发现并解决该服务 代码非常简单,通常运行速度非常快。不过,到目前为止,我的三星S8+出现了一个相当反复出现的问题(10次尝试中有5次)。目前无法在S6或像素XL上复制 问题是DiscoveryListener除了onDiscoveryStarted()之外从不做任何事情,它只是永远运行。如果我关闭应用程序并重新开始,有时它会工作,有时它会继续挂起 这

我正试图在我公司的专有硬件设备上执行服务发现,该设备拥有自己的WiFi网络,并通过该网络宣传“你好”服务。当我连接到WiFi网络时,我正在使用NSD发现并解决该服务

代码非常简单,通常运行速度非常快。不过,到目前为止,我的三星S8+出现了一个相当反复出现的问题(10次尝试中有5次)。目前无法在S6或像素XL上复制

问题是DiscoveryListener除了onDiscoveryStarted()之外从不做任何事情,它只是永远运行。如果我关闭应用程序并重新开始,有时它会工作,有时它会继续挂起

这就像是有一个阻塞的线程或其他东西,但是日志中没有有用的信息(我可以找到),而且我还没有找到任何可以锁定的信息,我可以做些什么来从中恢复

我添加了一个超时,它将在30秒后停止侦听器,但通常在30秒后重试时,它仍然不起作用

服务发现过程被包装在LiveData中,它在活动时启动

    const val SERVICE_TYPE_FOO = "_foo._tcp."

    private val serviceDiscoveryListener = ServiceDiscoveryListener()

    override fun onActive() {
        super.onActive()
        stopRunnable = StopDiscoveryRunnable()
        nsdManager.discoverServices(
            SERVICE_TYPE_FOO,
            NsdManager.PROTOCOL_DNS_SD,
            serviceDiscoveryListener
        )
        handler.postDelayed(stopRunnable, SERVICE_DISCOVERY_TIMEOUT_MS)
    }

private lateinit var stopRunnable: Runnable

private inner class StopDiscoveryRunnable : Runnable {
    override fun run() {
        try {
            nsdManager.stopServiceDiscovery(serviceDiscoveryListener)
            Timber.w("service discovery timed out")
            postValue(ServiceDiscoveryState.Error)
        } catch (e: Throwable) {
            // no-op
        }
    }
}
听众很简单

private inner class ServiceDiscoveryListener : NsdManager.DiscoveryListener {
    override fun onServiceFound(serviceInfo: NsdServiceInfo?) {
        if (serviceInfo != null) {
            if (serviceInfo.serviceName.isNotEmpty() &&
                serviceInfo.serviceName.containsFoo()
            ) {
                nsdManager.resolveService(serviceInfo, ResolveListener())
                handler.removeCallbacks(stopRunnable)
            }
        }
    }

    override fun onStopDiscoveryFailed(serviceType: String?, errorCode: Int) {
        Timber.d("stop discovery failed")
        nsdManager.stopServiceDiscovery(this)
        postValue(ServiceDiscoveryState.Error)
    }

    override fun onStartDiscoveryFailed(serviceType: String?, errorCode: Int) {
        Timber.d("start discovery failed")
        nsdManager.stopServiceDiscovery(this)
        postValue(ServiceDiscoveryState.Error)
    }

    override fun onDiscoveryStarted(serviceType: String?) {
        Timber.d("discovery started")
    }

    override fun onDiscoveryStopped(serviceType: String?) {
        Timber.d("discovery stopped")
    }

    override fun onServiceLost(serviceInfo: NsdServiceInfo?) {
        Timber.d("discovery service lost")
        postValue(ServiceDiscoveryState.Error)
    }
}

private inner class ResolveListener : NsdManager.ResolveListener {
    override fun onResolveFailed(serviceInfo: NsdServiceInfo?, errorCode: Int) {
        Timber.d("resolve failed. errorCode = $errorCode")
        if (errorCode != NsdManager.FAILURE_ALREADY_ACTIVE) {
            Timber.d("not already active, so error")
            postValue(ServiceDiscoveryState.Error)
        } else {
            Timber.d("already active")
        }
    }

    override fun onServiceResolved(serviceInfo: NsdServiceInfo?) {
        if (serviceInfo != null) {
            Timber.d("resolved service: ${serviceInfo.serviceName} host: ${serviceInfo.host}:${serviceInfo.port} type: ${serviceInfo.serviceType}")
            postValue(ServiceDiscoveryState.FooService(serviceInfo))
        }
    }
}
我一直无法在日志中找到多少价值,尽管我确实在事情不正常时看到了这条消息。试图寻找这方面的答案的努力并没有取得成果

04-26 13:50:14.541953-1218/?W//system/bin/netd:dnssd_客户端存根DNSServiceProcessResult使用无效的DNSServiceRef 0x72bb818000 FFFFFF DDDD调用

我还可以提供哪些其他信息

我在S8+上使用Andrey Druk的bonjour示例代码复制了挂起,它甚至没有使用NSD。。。因此,似乎问题出在核心mDNS代码中,而不是特定于Google的NSD实现


S8+上是否有一些系统软件或臃肿软件可能会干扰我使用NSD或mDNS-线程阻塞或其他东西?

我已经找到另一个S8+,它在这一个上工作得很好。区别?最重要的是,第二款手机运行的是安卓7.1.1,而原来的是8.0.0。没有解决我的问题,但另一个数据点。同样在S9上进行了测试,目前还没有出现这一问题,尽管服务发现可能会很慢,比在其他设备上慢得多。现在S9上也出现了这一问题:/在运行Android 8.0和三星体验9.0的Galaxy S7上也有类似问题。在华为P20 Lite上的同一网络上运行完全相同的应用程序,我在服务发现方面没有问题。