Android NSD-永久挂起/运行-特定于设备?
我正试图在我公司的专有硬件设备上执行服务发现,该设备拥有自己的WiFi网络,并通过该网络宣传“你好”服务。当我连接到WiFi网络时,我正在使用NSD发现并解决该服务 代码非常简单,通常运行速度非常快。不过,到目前为止,我的三星S8+出现了一个相当反复出现的问题(10次尝试中有5次)。目前无法在S6或像素XL上复制 问题是DiscoveryListener除了onDiscoveryStarted()之外从不做任何事情,它只是永远运行。如果我关闭应用程序并重新开始,有时它会工作,有时它会继续挂起 这就像是有一个阻塞的线程或其他东西,但是日志中没有有用的信息(我可以找到),而且我还没有找到任何可以锁定的信息,我可以做些什么来从中恢复 我添加了一个超时,它将在30秒后停止侦听器,但通常在30秒后重试时,它仍然不起作用 服务发现过程被包装在LiveData中,它在活动时启动Android NSD-永久挂起/运行-特定于设备?,android,bonjour,mdns,dns-sd,nsd,Android,Bonjour,Mdns,Dns Sd,Nsd,我正试图在我公司的专有硬件设备上执行服务发现,该设备拥有自己的WiFi网络,并通过该网络宣传“你好”服务。当我连接到WiFi网络时,我正在使用NSD发现并解决该服务 代码非常简单,通常运行速度非常快。不过,到目前为止,我的三星S8+出现了一个相当反复出现的问题(10次尝试中有5次)。目前无法在S6或像素XL上复制 问题是DiscoveryListener除了onDiscoveryStarted()之外从不做任何事情,它只是永远运行。如果我关闭应用程序并重新开始,有时它会工作,有时它会继续挂起 这
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上的同一网络上运行完全相同的应用程序,我在服务发现方面没有问题。