2014-09-12 29 views
12

Bir servis çözülürken bir servisi çözemiyorum? Eğer hata buysa ... Çözülene kadar beklemenin yolu nedir?Dinleyici zaten kullanımda (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: Zaten android.net.nsd.NsdManager.resolveService (NsdManager.java:613) kullanımda com.example.miguel.broadcast.LocalService $ 2'de dinleyici. onServiceFound (LocalService.java:145)

+0

Belki de sorununuz bu bildirilen hata ile ilgili olabilir? https://code.google.com/p/android/issues/detail?id=56830 – Okas

+0

@Okas Android L kullanıyorum ve bu hatayı asla almadım. – Kenny

+0

Hiç bir çözüm buldunuz mu? Bu hatayı benim lolipop cihazımda da görüyorum ama diğer cihazlarda değil. –

cevap

17

Beklemek zorunda değilsiniz! için javadocs'a bakarsanız, resolming (NsdServiceInfo serviceInfo, NsdManager.ResolveListener dinleyicisi) here, parametre dinleyicisi için "başarı veya başarısızlık durumunda geri arama almak için" olduğunu fark edersiniz. Sıfır olamaz. etkin bir hizmet çözümü. " Bunun için Dolayısıyla sırayla

aşağıdakileri yapın sadece çalışmak: MyResolveListener olan

mNsdManager.resolveService(service, new 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 
     } 
    } 

umut bu yardımcı olur :) Ben de bu sorun vardı

+0

Hey, cevap için teşekkürler. Bunu nasıl düzelttiğimi bile hatırlamıyorum, ama şimdi internet için şimdi yararlı olacak! ;) – Kenny

+0

İki aygıt bulduğunda işe yaramıyor –

9

, ve NsdChat here'da belirtilen Android NsdHelper uygulamasını takip ediyordu. Bu örnek, NsdHelper sınıfında tek bir NsdManager.ResolveListener mResolveListener oluşturmayı ve bu ResolveListener'ı NsdManager.resolveService'ye yapılan tüm çağrılar için kullanmayı gösterir.

here'dan itibaren "her bir etkin kayıt veya keşif talebi için ayrı bir Dinleyicinin kullanılması gerektiğini" okudum.

@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

Sen zaten kaydedilmiş bir dinleyici nesnesi geçmezken sağlamak gerekir:

Bunun yerine bir sınıf değişkeni mResolveListener kullanmak yerine, mNsdManager.resolveService diyoruz her zaman yeni bir dinleyici oluşturmak . Bu davranışla sonuçlanan işlemi here olarak görebilirsiniz.

Belge ve "İşleyici başına bir istek" zorlamak

API ve NsdManager uygulanması ayrı bir Dinleyici her aktif için kullanılacak olduğunu ima kural: Burada

taahhüt mesaj metnidir kayıt veya keşif isteği. Bu, resmi olarak belgelendirilmemiş veya düzgün bir şekilde uygulanmamıştır ve bir uygulama bir kerede birden fazla istek için Dinleyiciyi kullanıyorsa garip ve öngörülemeyen şeyler gerçekleşir.

Bu, açık bir gereklilik olması için belgeleri güncelleyin.

işleme için yeni bir istek gönderildiğinde kısıtlamayı zorlayın; Dinleyici zaten etkin bir isteğini izlemek için kullanılıyorsa, bir istisna atın.Uygulamaların hizmetlerini kaydını ve uygulama durdurulduğunda hizmet keşifler iptal gerektiği gerçeği (bu yapılmazsa eğer KitKat'ta ve önceki sürümlerde, onlar sızıntı gerekir.)

Belge

Yeniden düzen " Bu bir yarış durumu ortadan kaldırır - Dinleyici kez geri arama girildi uygulama tarafından yeniden kullanılabilir, böylece Dinleyici callback'inde önce oluşmaya Dinleyici" operasyonu bırakın. Bunu belgeleyin.

Geçiş 2: yazım hatası, API düzeyi ile ilgili belgeler eklenmiş, "meşgul dinleyici" için açıkça tanımlanmış bir dönüş değeri olan olarak değiştirilmiştir. Ayrıca

, Android Geliştiricileri sitesinden NsdChat örnek proje indirilen (diğer bir deyişle NsdChat.zip veya bu doğrultuda bir şey), o proje kodu güncel muhtemel olduğunu sadece bir uyarı.

yerine ana dal üzerinde son kodu kullanmayı deneyin ... kopyalayabilir ve here adresinin örnek projede yapıştırabilirsiniz.

+2

Ne yazık ki ana dal örneklemi hala yanlış yoldan yapılmış ... – slott

İlgili konular