监听器已在使用中(服务发现)

时间:2014-09-12 19:08:23

标签: 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);
        }
    }
}
  

java.lang.IllegalArgumentException:已在使用的侦听器   android.net.nsd.NsdManager.resolveService(NsdManager.java:613)               在com.example.miguel.broadcast.LocalService $ 2.onServiceFound(LocalService.java:145)

3 个答案:

答案 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的示例项目中。