2014-09-12 39 views
12

我無法解析一個服務而另一個服務正在解析?如果這就是錯誤意味着什麼......等待解決問題的方法是什麼?聽衆已在使用(服務發現)

@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異常:聽衆已經在 android.net.nsd.NsdManager.resolveService(NsdManager.java:613) 使用在com.example.miguel.broadcast.LocalService港幣$ 16。 onServiceFound(LocalService.java:145)

+0

也許你的問題與此報告的錯誤有關? https://code.google.com/p/android/issues/detail?id=56830 – Okas 2014-09-12 19:20:54

+0

@Okas我使用的是Android L,我從來沒有得到過這個錯誤。 – Kenny 2014-09-12 19:39:19

+0

有沒有找到解決辦法?我的棒棒糖設備上也出現了這個錯誤,但我的其他設備沒有。 – 2014-12-16 22:29:58

回答

17

您不必等待! 如果你看的javadoc, resolveService(NsdServiceInfo serviceInfo,NsdManager.ResolveListener聽衆) here你會發現,對於參數聽者它說的「在成功或失敗來接收回調。不能爲null。能不能在使用積極的服務解決方案「。

因此,爲了這個工作只做到以下幾點:

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

其中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 
     } 
    } 

希望這有助於:)

+0

嘿,謝謝你的回答。我甚至不記得我是如何解決這個問題的,但現在它對於互聯網現在是有用的! ;) – Kenny 2014-12-23 18:29:11

+0

當它找到兩個設備時它不起作用 – 2016-04-11 13:22:26

9

我有這個問題爲好,並一直遵循NsdChat here中的Android NsdHelper實施。此示例顯示在NsdHelper類中創建一個NsdManager.ResolveListener mResolveListener,並將該ResolveListener用於所有對NsdManager.resolveService的調用。

here我讀到「一個單獨的偵聽器將用於每個活動註冊或發現請求」。

@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

你需要確保你是不是在傳遞已經被註冊的偵聽對象:

因此,而不是使用類變量mResolveListener的,每次調用mNsdManager.resolveService時間創建一個新的監聽器。您可以看到導致此行爲更改的提交here

這裏是提交消息文本:

文獻和實施「每個監聽一個請求」規則

的API和執行NsdManager的暗示單獨 監聽器將被用於每個有源註冊或發現 請求。這沒有正式記錄或執行正確,並且如果應用程序一次對多個請求使用一個 監聽器,會發生奇怪和不可預測的事情。

更新文檔以使其成爲明確的要求。

當提交新請求 處理時強制執行限制;如果偵聽器已被用於跟蹤活動的 請求,則引發異常。

文件的事實,應用應該註銷服務時,應用程序停止取消 服務的發現(在奇巧和以前 版本中,如果不這樣做,他們會泄露)。

重新排序「釋放監聽器「操作發生在監聽器 回調之前,這樣監聽器可以被應用程序重複使用一次 回調已被輸入 - 這消除了競爭條件。 記錄此。

通過2:錯別字,添加關於API級別的文檔,更改爲使用 爲「繁忙的偵聽程序」顯式定義的返回值。

而且,只是一個警告,如果你從Android開發者網站下載的NsdChat樣本項目(即NsdChat.zip或類似的規定),該項目代碼很可能已經過時。

嘗試使用主分支上的最新代碼,而不是...您可以將其複製並粘貼到here的示例項目中。

+2

可悲的是,主分支樣本仍然以錯誤的方式完成... – slott 2016-05-07 16:39:24