有人可以解释可以传递给回调的错误消息吗?
public void onResolveFailed(NsdServiceInfo serviceInfo, int errorCode)
我以前见过错误代码 3,但不知道它是什么意思。文档似乎充其量是不稳定的......
干杯,
有人可以解释可以传递给回调的错误消息吗?
public void onResolveFailed(NsdServiceInfo serviceInfo, int errorCode)
我以前见过错误代码 3,但不知道它是什么意思。文档似乎充其量是不稳定的......
干杯,
我通过再次调用 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 一次或两次,然后下一个服务得到解决,依此类推。
有同样的问题并从 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
这个我也有点懵。。。
这是正在发生的事情。当您发现服务时,您通常会在同一毫秒内多次获得完全相同的服务。
如果您记录输出,NsdManager.DiscoveryListener.onServiceFound(NsdServiceInfo service)
您会看到这一点。
现在,您可能使用mNsdManager.resolveService(service, mResolveListener)
. 只有第一次尝试会开始解决,其他人会给出 FAILURE_ALREADY_ACTIVE。(至少在第一个完成之前)
我这两天遇到了这个问题……我解决了……
我第一次做 resolveService(service, mResolveListener);
没有回调
我再次做同样的服务,resolveService(service, mResolveListener);
回调是错误代码 3
至少我找到了,因为我的服务器名称是“III....”
我取出双引号,它的工作
希望它可以帮助你。
我发现用信号量重用同一个监听器会产生最好的结果。
if (semaphore.tryAcquire()) {
mNsdManager.resolveService(service, resolveListener);
}
使用 tryAcquire 因为我们不想阻止 onServiceFound ,这将完全锁定它。通过这种方法,我们最终可以显示网络上的所有服务。