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...."

Я выношу двойные кавычки, и это работа

надеюсь, что это может помочь вам.

Другие вопросы по тегам