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

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)


Ale*_*ood 6

您需要确保没有传入已经注册的侦听器对象。您可以在此处查看导致此行为更改的提交。

这是提交消息文本:

记录并执行“每个监听器一个请求”规则

NsdManager 的 API 和实现意味着每个活动注册或发现请求都将使用单独的侦听器。这没有正式记录或正确执行,如果应用程序一次使用一个侦听器进行多个请求,就会发生奇怪和不可预测的事情。

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

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

记录应用程序在停止时应取消注册服务并取消服务发现的事实(在 KitKat 和之前的版本中,如果不这样做,它们将泄漏。)

重新排序“释放侦听器”操作在侦听器回调之前发生,以便一旦进入回调,应用程序就可以重用侦听器 - 这消除了竞争条件。记录这个。

第 2 步:拼写错误,添加了有关 API 级别的文档,更改为使用明确定义的“忙碌侦听器”返回值。

另外,请注意,如果您从 Android 开发人员站点(即NsdChat.zip或类似内容)下载了 NsdChat 示例项目,则该项目代码可能已过时。

尝试使用 master 分支上的最新代码……您可以从这里将其复制并粘贴到您的示例项目中。