2014-07-09 50 views
4

從示例http://developer.android.com/training/connect-devices-wirelessly/nsd.html代碼開始,我一直在構建一個旨在在同一子網中的多個設備上運行的應用程序。每個設備都註冊相同的服務並嘗試使用該服務發現子網中的其他服務。如文檔中所述,每次設備註冊服務時,名稱都會被添加一個附加的「(N)」,其中N爲整數。每個設備,當它做一個發現alaNsdManager無法解析多個發現的服務

public void discoverServices() { 
    mNsdManager.discoverServices(
     SERVICE_TYPE, NsdManager.PROTOCOL_DNS_SD, mDiscoveryListener); 
} 

發現所有的服務註冊。我使用散列圖追蹤它們,該散列圖保留了發現的NsdServiceInfo記錄。

問題出現在我嘗試解決它們時。如果我迭代hashmap並解決每個NsdServiceInfo,只有第一個成功。我認爲可能問題是需要單獨的NsdManager.ResolveListener,所以我爲每個NsdServiceInfo記錄創建一個,但沒有喜悅。

如果我阻止hashmap中的第一個服務被解析,下一個工作。下面是DDMS輸出:

07-09 17:11:36.799: D/P2PServiceManager(1958): Resolving services with type : PeerDiscovery 
07-09 17:11:36.799: W/P2PServiceManager(1958): Resolving PeerDiscovery services with name : PeerDiscovery (3) 
07-09 17:11:36.799: W/P2PServiceManager(1958): Resolving PeerDiscovery services with name : PeerDiscovery (2) 
07-09 17:11:36.807: E/P2PServiceManager(1958): RRRRRRRRRRRRRRRRRRR Resolve failed : error code 3 
07-09 17:11:36.830: E/P2PServiceManager(1958): RRRRRRRRRRRRRRRRRRR Resolve Succeeded. name: PeerDiscovery\032(3)type: ._http._udphost: /192.168.1.145port: 53221txtRecord: null 

我懷疑有一些非重入代碼或一些其他類似的問題,但如果其他人已經看到了這個問題,我想知道。谷歌和StackOverflow似乎沒有答案。

[2014-07-24]最後我堅持迭代發現的服務來解決它們,但是在解決下一個服務之前等待每個結果。我認爲這是做事情的正確方法,但是從NsdManager doc不是很清楚。

+1

這是什麼運氣?似乎有同樣的問題 –

回答

0

最後我得到了,在我的應用程序相同的問題,發現我的網絡在同一個服務名多的Bonjour設備

我做了什麼:

活動>開始發現監聽器>開始ResolveListener

它們都在相同的活動中聲明並推回我找到的對象,將其添加到設備對象列表中activity.addDevice(ip, port, name, service);

現在我只是讓每個設備在本身,而不是覆蓋監聽器中的結果,只獲得一個或沒有結果。

希望它可以幫助有相同問題的人。我會盡量準備一個代碼示例儘快。

0

我得到了類似的問題,我想同時發現2個服務。對我而言,解決方案只是等待第一個解決或失敗,然後纔開始發現下一個。所以這個發現不是同時開始的。例如可以使用CountDownLatch。

CountDownLatch latch = new CountDownLatch(1); 
nsdManager.discoverServices(serviceType1, NsdManager.PROTOCOL_DNS_SD, discoveryListener); 
latch.await(); 
nsdManager.discoverServices(serviceType2, NsdManager.PROTOCOL_DNS_SD, discoveryListener); 

....

ResolveListener { 
    public void onServiceResolved(NsdServiceInfo serviceInfo) { 
     // do your stuff 
     latch.countDown(); 
    } 
} 

不要忘了在所有失敗的案例倒計時閂!

相關問題