Ken*_*nny 15 java android service-discovery
我无法解决一项服务而另一项服务正在解决?如果这就是错误的意思......等待它解决的方法是什么?
@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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
java.lang.IllegalArgumentException:已在android.net.nsd.NsdManager.resolveService(NsdManager.java:613)中使用的侦听器,位于com.example.miguel.broadcast.LocalService $ 2.onServiceFound(LocalService.java:145)
Tal*_*lha 23
你不必等!如果你看的javadoc,resolveService(NsdServiceInfo serviceInfo,NsdManager.ResolveListener监听器) 在这里,你会发现,对于参数听者它说的"接收后的成功或失败的回调.不能为null.不能被使用为主动服务解析度."
因此,为了使其工作,只需执行以下操作:
mNsdManager.resolveService(service, new MyResolveListener());
Run Code Online (Sandbox Code Playgroud)
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
}
}
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助 :)
小智 12
我有这个问题为好,并已按照NsdChat奠定了Android的NsdHelper执行这里.此示例显示在NsdHelper类中创建单个NsdManager.ResolveListener mResolveListener,并将该ResolveListener用于对NsdManager.resolveService的所有调用.
从这里我读到"每个活动的注册或发现请求都使用一个单独的监听器".
因此,每次调用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);
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
您需要确保没有传入已经注册的侦听器对象。您可以在此处查看导致此行为更改的提交。
这是提交消息文本:
记录并执行“每个监听器一个请求”规则
NsdManager 的 API 和实现意味着每个活动注册或发现请求都将使用单独的侦听器。这没有正式记录或正确执行,如果应用程序一次使用一个侦听器进行多个请求,就会发生奇怪和不可预测的事情。
更新文档以使其成为明确要求。
在提交新请求进行处理时强制执行限制;如果侦听器已被用于跟踪活动请求,则抛出异常。
记录应用程序在停止时应取消注册服务并取消服务发现的事实(在 KitKat 和之前的版本中,如果不这样做,它们将泄漏。)
重新排序“释放侦听器”操作在侦听器回调之前发生,以便一旦进入回调,应用程序就可以重用侦听器 - 这消除了竞争条件。记录这个。
第 2 步:拼写错误,添加了有关 API 级别的文档,更改为使用明确定义的“忙碌侦听器”返回值。
另外,请注意,如果您从 Android 开发人员站点(即NsdChat.zip或类似内容)下载了 NsdChat 示例项目,则该项目代码可能已过时。
尝试使用 master 分支上的最新代码……您可以从这里将其复制并粘贴到您的示例项目中。