NSNetworkManager.ResolveListener сообщения Android
Может кто-нибудь объяснить сообщения об ошибках, которые могут быть переданы в обратные вызовы, т.е.
public void onResolveFailed(NsdServiceInfo serviceInfo, int errorCode)
Я видел код ошибки 3 раньше, но понятия не имею, что это значит. Документация кажется в лучшем случае ненадежной...
Ура,
5 ответов
Возник тот же вопрос и получил ответ из источников 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
Я обошел это, снова вызвав resolService. Это может дать сбой пару раз подряд, но в конечном итоге разрешится.
@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);
}
}
Вместо вызова resolService изнутри onServiceFound я вызываю отдельную декларацию этого:
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.DiscoveryListener.onServiceFound(NsdServiceInfo service)
вы увидите это.
Теперь вы, вероятно, разрешите службу, используя mNsdManager.resolveService(service, mResolveListener)
, Только первая попытка начнет разрешаться, другие будут давать FAILURE_ALREADY_ACTIVE. (По крайней мере, пока первая не будет завершена)
Я обнаружил, что повторное использование одного и того же слушателя с семафором дает лучший результат.
if (semaphore.tryAcquire()) {
mNsdManager.resolveService(service, resolveListener);
}
Используя tryAcquire, мы не хотим блокировать onServiceFound, который полностью его заблокирует. При таком подходе мы в конечном итоге получаем все сервисы в сети, чтобы показать.
Я встретил эту проблему два дня.... и я ее решаю...
в первый раз я делаю resolService(сервис, mResolveListener);
нет обратного звонка
и я делаю снова тот же сервис, resolService(сервис, mResolveListener);
обратный вызов - код ошибки 3
По крайней мере, я нашел, потому что мой сервер называется "III...."
Я выношу двойные кавычки, и это работа
надеюсь, что это может помочь вам.