2014-09-12 17 views
12

Non riesco a risolvere un servizio mentre un altro è in fase di risoluzione? Se questo è ciò che l'errore significa ... Qual è il modo di aspettare fino a quando non viene risolto?Listener già in uso (Service Discovery)

@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: ascoltatore già in uso presso android.net.nsd.NsdManager.resolveService (NsdManager.java:613) a com.example.miguel.broadcast.LocalService 2 $. onServiceFound (LocalService.java:145)

+0

Forse il tuo problema è legato a questo bug segnalato? https://code.google.com/p/android/issues/detail?id=56830 – Okas

+0

@Okas Sto usando Android L e non ho mai ricevuto questo errore. – Kenny

+0

Hai mai trovato una soluzione? Ottengo questo errore anche sul mio dispositivo lollipop ma non sugli altri miei dispositivi. –

risposta

17

Non devi aspettare! Se si guardano le javadoc per resolveService (NsdServiceInfo serviceInfo, NsdManager.ResolveListener listener) here si noterà che per il listener dei parametri si dice "per ricevere la richiamata in caso di esito positivo o negativo." Non può essere nullo. una risoluzione del servizio attiva. "

Quindi, in modo che questo lavoro solo effettuare le seguenti operazioni:

mNsdManager.resolveService(service, new MyResolveListener()); 

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

Spero che questo aiuti :)

+0

Ehi, grazie per la risposta. Non ricordo nemmeno come ho risolto questo problema, ma ora sarebbe utile per Internet ora! ;) – Kenny

+0

Non funziona quando trova due dispositivi –

9

Ho avuto questo problema pure, e ha seguito l'implementazione di Android NsdHelper in NsdChat here. Questo esempio mostra la creazione di un singolo NsdManager.ResolveListener mResolveListener nella classe NsdHelper e l'utilizzo di ResolveListener per tutte le chiamate a NsdManager.resolveService.

Da here Ho letto che "un Listener separato deve essere utilizzato per ogni richiesta di registrazione o scoperta attiva".

Così, invece di utilizzare un mResolveListener variabile di classe, creare un nuovo listener ogni volta che si chiama 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); 
      } 
     }); 
    } 
} 
3

è necessario assicurarsi che non si sta passando un oggetto listener che è già stato registrato . È possibile visualizzare il commit che ha comportato questo comportamento modificato here.

Ecco il testo messaggio di commit:

documento e far rispettare "una richiesta per Listener" regola

L'API e l'implementazione di NsdManager implica che una parte Listener deve essere utilizzato per ogni attivo registrazione o scoperta richiesta. Questo non è formalmente documentato o correttamente applicato, e cose strane e imprevedibili si verificano se un'applicazione utilizza un listener per più di una richiesta alla volta.

Aggiornare la documentazione per rendere questo un requisito esplicito.

Applicare la restrizione quando viene inoltrata una nuova richiesta per l'elaborazione ; se Listener è già in uso per tenere traccia di una richiesta attiva , lanciare un'eccezione.

documento il fatto che le applicazioni dovrebbero annullare la registrazione dei servizi ed annullare scoperte di servizio quando l'applicazione viene arrestato (in KitKat e precedenti stampa, faranno la fuga se ciò non viene fatto.)

Re-order " rilasciare l'operazione "Listener" prima della callener dell'ascoltatore , in modo che il listener possa essere riutilizzato dall'applicazione una volta che è stata immessa la richiamata, eliminando così una condizione di competizione. Documenta questo.

Passaggio 2: errori di battitura, aggiunta di documentazione sul livello API, modificato in con un valore restituito esplicitamente per "listener occupato".

Inoltre, solo un avvertimento che se si è scaricato il progetto di esempio NsdChat dal sito Android Developers (vale a dire NsdChat.zip o qualcosa del genere), che il codice del progetto è probabilmente obsoleto.

Provare a utilizzare l'ultimo codice sul ramo master invece ... è possibile copiarlo e incollarlo nel progetto di esempio da here.

+2

Purtroppo l'esempio di diramazione principale è ancora fatto nel modo sbagliato ... – slott

Problemi correlati