2

有人可以解释可以传递给回调的错误消息吗?

public void onResolveFailed(NsdServiceInfo serviceInfo, int errorCode)

我以前见过错误代码 3,但不知道它是什么意思。文档似乎充其量是不稳定的......

干杯,

4

5 回答 5

12

我通过再次调用 resolveService 来解决这个问题。它可能会连续失败几次,但最终会解决。

        @Override
        public void onServiceFound(NsdServiceInfo serviceInfo) {
            Log.d(TAG, "Service found: "+ serviceInfo);
            if (!serviceInfo.getServiceType().equals(SERVICE_TYPE)){
                Log.d(TAG, "Unknown service type: " + serviceInfo.getServiceType());
            } else if (serviceInfo.getServiceName().equals(mServiceName)){
                Log.d(TAG, "Same machine");
            } else {
                startResolveService(serviceInfo);
            }
        }

我没有从 onServiceFound 中调用 resolveService,而是调用它的单独声明:

        private void startResolveService(NsdServiceInfo serviceInfo){
            NsdManager.ResolveListener newResolveListener = new NsdManager.ResolveListener() {
                @Override
                public void onResolveFailed(NsdServiceInfo serviceInfo, int errorCode) {
                    Log.e(TAG, "Resolve Failed: " + serviceInfo + "\tError Code: " + errorCode);
                    switch (errorCode) {
                        case NsdManager.FAILURE_ALREADY_ACTIVE:
                            Log.e(TAG, "FAILURE_ALREADY_ACTIVE");
                            // Just try again...
                            startResolveService(serviceInfo);
                            break;
                        case NsdManager.FAILURE_INTERNAL_ERROR:
                            Log.e(TAG, "FAILURE_INTERNAL_ERROR");
                            break;
                        case NsdManager.FAILURE_MAX_LIMIT:
                            Log.e(TAG, "FAILURE_MAX_LIMIT");
                            break;
                    }
                 }

                @Override
                public void onServiceResolved(NsdServiceInfo serviceInfo) {
                    Log.i(TAG, "Service Resolved: " + serviceInfo);
                    mLocatedServices.add(serviceInfo);
                    reportNewService();
                }
            };
            mNsdManager.resolveService(serviceInfo, newResolveListener);
        }

当几乎立即发现多个服务时,第一个得到解决,然后您再获得 FAILURE_ALREADY_ACTIVE 一次或两次,然后下一个服务得到解决,依此类推。

于 2015-01-06T22:26:18.627 回答
1

有同样的问题并从 NsdManager 来源得到答案:

/**
 * Failures are passed with {@link RegistrationListener#onRegistrationFailed},
 * {@link RegistrationListener#onUnregistrationFailed},
 * {@link DiscoveryListener#onStartDiscoveryFailed},
 * {@link DiscoveryListener#onStopDiscoveryFailed} or {@link ResolveListener#onResolveFailed}.
 *
 * Indicates that the operation failed due to an internal error.
 */
public static final int FAILURE_INTERNAL_ERROR               = 0;

/**
 * Indicates that the operation failed because it is already active.
 */
public static final int FAILURE_ALREADY_ACTIVE              = 3;

/**
 * Indicates that the operation failed because the maximum outstanding
 * requests from the applications have reached.
 */
public static final int FAILURE_MAX_LIMIT                   = 4;

编辑:

实际上它在开发人员文档中提到:http: //developer.android.com/reference/android/net/nsd/NsdManager.html

于 2013-11-29T11:00:43.237 回答
1

这个我也有点懵。。。

这是正在发生的事情。当您发现服务时,您通常会在同一毫秒内多次获得完全相同的服务。

如果您记录输出,NsdManager.DiscoveryListener.onServiceFound(NsdServiceInfo service)您会看到这一点。

现在,您可能使用mNsdManager.resolveService(service, mResolveListener). 只有第一次尝试会开始解决,其他人会给出 FAILURE_ALREADY_ACTIVE。(至少在第一个完成之前)

于 2014-05-30T21:36:27.107 回答
0

我这两天遇到了这个问题……我解决了……

我第一次做 resolveService(service, mResolveListener);

没有回调

我再次做同样的服务,resolveService(service, mResolveListener);

回调是错误代码 3

至少我找到了,因为我的服务器名称是“III....”

我取出双引号,它的工作

希望它可以帮助你。

于 2014-07-04T07:54:45.210 回答
0

我发现用信号量重用同一个监听会产生最好的结果。

if (semaphore.tryAcquire()) {
    mNsdManager.resolveService(service, resolveListener);
}

使用 tryAcquire 因为我们不想阻止 onServiceFound ,这将完全锁定它。通过这种方法,我们最终可以显示网络上的所有服务。

于 2016-12-31T00:00:31.757 回答