2014-09-12 76 views
12

我无法解析一个服务而另一个服务正在解析?如果这就是错误意味着什么......等待解决问题的方法是什么?听众已在使用(服务发现)

@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港币$ 16。 onServiceFound(LocalService.java:145)

+0

也许你的问题与此报告的错误有关? https://code.google.com/p/android/issues/detail?id=56830 – Okas 2014-09-12 19:20:54

+0

@Okas我使用的是Android L,我从来没有得到过这个错误。 – Kenny 2014-09-12 19:39:19

+0

有没有找到解决办法?我的棒棒糖设备上也出现了这个错误,但我的其他设备没有。 – 2014-12-16 22:29:58

回答

17

您不必等待! 如果你看的javadoc, resolveService(NsdServiceInfo serviceInfo,NsdManager.ResolveListener听众) here你会发现,对于参数听者它说的“在成功或失败来接收回调。不能为null。能不能在使用积极的服务解决方案“。

因此,为了这个工作只做到以下几点:

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 
     } 
    } 

希望这有助于:)

+0

嘿,谢谢你的回答。我甚至不记得我是如何解决这个问题的,但现在它对于互联网现在是有用的! ;) – Kenny 2014-12-23 18:29:11

+0

当它找到两个设备时它不起作用 – 2016-04-11 13:22:26

9

我有这个问题为好,并一直遵循NsdChat here中的Android NsdHelper实施。此示例显示在NsdHelper类中创建一个NsdManager.ResolveListener mResolveListener,并将该ResolveListener用于所有对NsdManager.resolveService的调用。

here我读到“一个单独的侦听器将用于每个活动注册或发现请求”。

@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); 
      } 
     }); 
    } 
} 
3

你需要确保你是不是在传递已经被注册的侦听对象:

因此,而不是使用类变量mResolveListener的,每次调用mNsdManager.resolveService时间创建一个新的监听器。您可以看到导致此行为更改的提交here

这里是提交消息文本:

文献和实施“每个监听一个请求”规则

的API和执行NsdManager的暗示单独 监听器将被用于每个有源注册或发现 请求。这没有正式记录或执行正确,并且如果应用程序一次对多个请求使用一个 监听器,会发生奇怪和不可预测的事情。

更新文档以使其成为明确的要求。

当提交新请求 处理时强制执行限制;如果侦听器已被用于跟踪活动的 请求,则引发异常。

文件的事实,应用应该注销服务时,应用程序停止取消 服务的发现(在奇巧和以前 版本中,如果不这样做,他们会泄露)。

重新排序“释放监听器“操作发生在监听器 回调之前,这样监听器可以被应用程序重复使用一次 回调已被输入 - 这消除了竞争条件。 记录此。

通过2:错别字,添加关于API级别的文档,更改为使用 为“繁忙的侦听程序”显式定义的返回值。

而且,只是一个警告,如果你从Android开发者网站下载的NsdChat样本项目(即NsdChat.zip或类似的规定),该项目代码很可能已经过时。

尝试使用主分支上的最新代码,而不是...您可以将其复制并粘贴到here的示例项目中。

+2

可悲的是,主分支样本仍然以错误的方式完成... – slott 2016-05-07 16:39:24