1

我的BLE外設Android應用程序寫入2個不同的設備特性,並接收來自其他2個設備的通知。 RxAndroidBle庫的開發人員對同一個RxBleConnection實例上的多個訂閱提出警告,但我沒有看到將所有這些I/O操作組合到一個單獨的.subscribe()中的任何實際方式,特別是因爲其中一個通知是一個非常穩定的數據「消防水帶」。在RxJava中使用多個.subscribe()語句

不知道有什麼更好的,我一直只是將RxBleConnection存儲在一個變量中,並將其用於多個.subscribe() s。據我所知,這一直工作正常。我調查了RxAndroidBle圖書館的ConnectionSharingAdapter,但是,儘管我已經分析了代碼,但我不明白它提供的優點超過了我的簡單化方法(儘管我很想知道)。

一般來說,關於如何引入多個狀態和潛在陷阱的一些細節將會有所幫助。問題:

  1. 什麼是錯在變量存儲RxBleConnection和使用它的多.subscribe() S'
  2. 如果這是一個問題,ConnectionSharingAdapter如何解決它?
  3. 說多個訂閱「引入狀態」是什麼意思,以及這怎麼會導致問題?
  4. 將所有四種特性I/O操作合併到一個單獨的.subscribe()(這不會降低性能)嗎?
+0

這個問題有點太寬泛 - 向圖書館的開發人員詢問爲什麼_they_推薦多個訂閱可能更容易。從純粹的Rx觀點來看,只有一個主題(例如RxJava的'publish()')才能真正實現對同一個(冷)流的多個訂閱,而關於主題使用的討論則可能是一個更大的問題在這個網站和許多其他資源上有答案。 – Whymarrh

+0

我問他們這個問題,他們告訴我將討論移到StackOverflow,所以我在這裏。 –

回答

1

什麼是錯在變量存儲RxBleConnection和使用它的多.subscribe() S' (...) 說多個訂閱「引入狀態」是什麼意思,以及這如何引起問題?

這兩個問題幾乎相同。 RxBleConnection是對BLE客戶端與BLE服務器交換一些握手數據包之後的狀態的抽象,之後客戶端和服務器都被認爲已連接。不幸的是,由於各種原因,幾乎在任何時候都可能斷開這種連接(並且經常發生),其中單個存儲的變量RxBleConnection無法以反應方式輕易表達。

另一方面,一旦連接斷開,觀察RxBleDevice.establishConnection()會向用戶傳播錯誤。儘管在連接斷開後發射的RxBleConnection沒有任何功能 - 連接保存的變量在發生時不會通知問題。

因此,如果用戶將RxBleConnection保存到一個變量 - 它引入了一個變量可能處於的狀態,並且用戶負責傳播(清除變量)後面可能發生的錯誤。如果訂閱.establishConnection()的對方會在連接無法使用時發出異常。

許多程序員在實踐中可能會注意到 - 管理狀態是應用程序中最常見的錯誤來源。減少狀態是減少錯誤風險的一種方法。

有一個很好的(但相當先進)由傑克沃頓從Devoxx談話:Managing State with RxJava by Jake Wharton

如果這是一個問題,如何ConnectionSharingAdapter解決呢?

.establishConnection()觀察到不允許有由於BLE連接和通信的狀態特性多於一個同時subsription(請求 - 響應是一個衆所周知的圖案),並具有多於一個.subscribe()使用相同的連接可能會在代碼中沒有明確的跟蹤的情況下導致對方的干擾。這就是爲什麼BleAlreadyConnectedException是爲不遵循代碼中所有使用RxBleConnection的地方的用戶引入的。 ConnectionSharingAdapter是作爲用戶的助手引入的,他們有意識地決定在多個交互器之間共享單個連接。如果RxBleConnection被破壞,ConnectionSharingAdapter將傳播錯誤到所有Subscriber s。

是否有任何將所有四種特性I/O操作合併爲一個單獨的.subscribe()(這不會降低性能)的乾淨方式?

在大多數情況下,可以乾淨地組合許多I/O。上述談話涉及這個話題。正確組合多個I/O會帶來額外分配的成本,但由於此通信通道的速度較低,因此處理BLE時很少出現問題。

+0

因爲我的其中一個通知可能會產生一個可以減免BLE帶寬的不間斷數據包流,所以我認爲不會爲每個數據包建立和釋放連接。聽起來像是使用'ConnectionSharingAdapter'的情況,不是嗎? –

+0

'ConnectionSharingAdapter'只是標準'RxJava'運算符的縮寫(可以通過檢查類來檢查)。只要可行,連接應該保持不變。 –

+0

我也感到困惑 - 由於用戶輸入,我的應用程序可以在各種時間發出無數的BLE命令。單個subscribe()方法怎麼可能考慮到這一點? –