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

2022-09-03 03:36:48

我无法解析一个服务,而另一个服务正在解析?如果这就是错误的含义...等待解决的方法是什么?

@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: listener 已经在 android.net.nsd.NsdManager.resolveService(NsdManager.java:613) at com.example.miguel.broadcast.LocalService$2.onServiceFound(LocalService.java:145)


答案 1

您不必等待!如果你在这里查看javadocs for resolveService(NsdServiceInfo serviceInfo,NsdManager.ResolveListener listener),你会注意到,对于参数监听器,它说“在成功或失败时接收回调。不能为空。不能用于活动服务解决方案。

因此,为了使其正常工作,只需执行以下操作:

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

希望这有助于:)


答案 2

我也遇到了这个问题,并且一直在关注NsdChat中列出的Android NsdHelper实现。此示例演示如何在 NsdHelper 类中创建单个 NsdManager.ResolveListener mResolveListener,并将该 ResolveListener 用于对 NsdManager.resolveService 的所有调用。

从这里我读到“每个活动的注册或发现请求将使用一个单独的监听器”。

因此,不要使用类变量 mResolveListener,而是在每次调用 mNsdManager.resolveService 时创建一个新的侦听器:

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

推荐