我无法解决一项服务而另一项服务正在解决?如果这就是错误的意思......等待它解决的方法是什么?
@Override
public void onServiceFound(NsdServiceInfo service) {
Log.d(TAG, "Service found. " + service);
if (service.getServiceType().equals(SERVICE_TYPE)) {
if (service.getServiceName().contains(mServiceName)) {
mNsdManager.resolveService(service, mResolveListener);
}
}
}
java.lang.IllegalArgumentException:已在使用的侦听器 android.net.nsd.NsdManager.resolveService(NsdManager.java:613) 在com.example.miguel.broadcast.LocalService $ 2.onServiceFound(LocalService.java:145)
答案 0 :(得分:21)
你不必等待! 如果你看看javadocs resolveService(NsdServiceInfo serviceInfo,NsdManager.ResolveListener listener) here您会注意到,对于参数监听器,它会说“成功或失败后接收回调”。不能为空。不能用于有效的服务解析。"
因此,为了实现这一点,请执行以下操作:
mNsdManager.resolveService(service, new MyResolveListener());
MyResolveListener在哪里:
private class MyResolveListener implements NsdManager.ResolveListener {
@Override
public void onResolveFailed(NsdServiceInfo serviceInfo, int errorCode) {
//your code
}
@Override
public void onServiceResolved(NsdServiceInfo serviceInfo) {
//your code
}
}
希望这有助于:)
答案 1 :(得分:12)
我也有这个问题,并且一直在遵循NsdChat here中规定的Android NsdHelper实现。此示例显示在NsdHelper类中创建单个NsdManager.ResolveListener mResolveListener,并将该ResolveListener用于对NsdManager.resolveService的所有调用。
从here开始,我读到了#34;每个有效的注册或发现请求都会使用一个单独的监听器"。
因此,每次调用mNsdManager.resolveService时,不要使用类变量mResolveListener,而是创建一个新的侦听器:
@Override
public void onServiceFound(NsdServiceInfo serviceInfo) {
Log.d(TAG, "Service found: "+ serviceInfo);
if (serviceInfo.getServiceType().equals(SERVICE_TYPE)){
mNsdManager.resolveService(serviceInfo, new NsdManager.ResolveListener() {
@Override
public void onResolveFailed(NsdServiceInfo serviceInfo, int errorCode) {
Log.e(TAG, "Resolve Failed: " + serviceInfo);
}
@Override
public void onServiceResolved(NsdServiceInfo serviceInfo) {
Log.i(TAG, "Service Resolved: " + serviceInfo);
}
});
}
}
答案 2 :(得分:4)
您需要确保没有传入已注册的侦听器对象。您可以看到导致此行为的提交更改here。
这是提交消息文本:
记录并执行每个听众的一个请求"规则
NsdManager的API和实现意味着单独的 监听器将用于每个活动的注册或发现 请求。这不是正式记录或正确执行的,并且 如果应用程序使用了一个奇怪的和不可预测的事情 一次监听一个以上的请求。
更新文档以明确要求。
在提交新请求时强制执行限制 处理;如果监听器已被用于跟踪活动状态 请求,抛出异常。
记录应用程序应取消注册服务并取消的事实 应用程序停止时的服务发现(在KitKat和之前 如果没有完成,它们会泄漏。)
重新订购"释放听众"在Listener之前发生的操作 回调,以便监听器可以被应用程序重用一次 已经输入了回调 - 这消除了竞争条件。 记录下来。
传递2:拼写错误,添加了有关API级别的文档,更改为使用 "忙聆听者"。
的明确定义的返回值
另外,只是警告如果您从Android开发者网站下载NsdChat示例项目(即NsdChat.zip
或其他内容),该项目代码可能已过期。
尝试使用主分支上的最新代码...您可以将其复制并粘贴到here的示例项目中。