2017-08-16 108 views
0

這是一個更普遍的問題,而不是一個特定的問題。Android Ble客戶端應用程序體系結構

基本上我正在開發一個Android應用程序,它與Ble Peripheral Device進行通信。 我使用RxAndroidBle庫處理Ble通信。至於一般模式,我決定嘗試莫斯比MVI,但是 這並不重要。

我到目前爲止所做的是我創建的BluetoothManager類,它負責執行Ble Device上的所有操作 。這個類是一個Singleton(我知道它不推薦在Android上使用),並且我使用Dagger作爲範圍, 這隻被注入到那些應該執行一些Ble通信的交互器中。 此類返回具有一些POJO的Observables,它們在交互器中轉換爲ViewStates,並向UI中移動更高。 訂閱在Mosby MVI模式下的演示者中。

基本上感謝我把這個Ble設備作爲一個常規的數據源,和一些改造服務或者任何db一樣。 只要我正在進行像寫作和閱讀某些單一特徵的原子操作,那就完全沒問題。

問題是當我需要啓動某種可能需要很長時間的同步時,應該在後臺完成, 不應該綁定到UI,但是在某些屏幕上,用戶應該能夠看到進展。 在這裏我開始考慮使用Android服務並將所有Ble通信邏輯放在那裏,但是在我看來,使用Android服務打破了邏輯分離的任何嘗試,並且找不到適合它的好方法。

第三種選擇是同步和保留BluetoothManager用於界面到UI的原子操作的服務,但是 我認爲這很麻煩,我很高興在所有Ble的東西在一個地方。

我知道這是很長,但是這一切都爲一個問題 - >什麼是Android上 BLE裝置通信保持層分離並保持儘可能獨立時應遵循的最佳模式。 我找不到任何有關處理的好文章,如果有任何文章過時,請不要使用Rx方法。 如果它太泛型,我可以指定一些更多的細節,但我更多的是尋找建築建議,而不是代碼片段。

回答

0

什麼是這樣的: ,而不是在主持人訂閱直接藍牙,引進一類BleRepository

然後BleRepository提供梅託德Observable<Foo>(foo是任何數據的演示/ UI應該看到)和操作執行例如doA()。事情是這樣的:

interface BleRepository { 


    // Read Data 
    Observable<Foo> getDataObservable(); 

    // Write Data operations 
    Completable doA(); 
    Completable doB(); 

} 

所以演示訂閱BleRepository,而不是直接的藍牙連接。

所以,現在每當你做一個「寫操作」你只是執行它,但你總是從getDataObservable()讀取新的數據,即使寫操作本身返回的新數據,讀取數據總是通過getDataObservable()去。

因此BleRepository基本上只是您演示者使用的公共API。演示者不知道實際的藍牙連接。因此,接下來你可以做的是將實際的藍牙連接轉移到android服務中,我們稱之爲BluetoothService。然後BluetoothService get的連接,並且每當同步運行或其他任何您的連接收到/發送時,它都會將該數據發送回由服務訂閱的BleRepository.getDataObservable()。您只需確保Service和Presenter「共享」相同的BleRepository實例。即使用匕首注入相同的實例或使其成爲一個單身...任何最適合您的工具。

根據您的用例,您還可以使BluetoothService訂閱知道,例如在RxJavas onSubscribe上啓動android服務,並停止取消訂閱/ onTerminal上的服務。但聽起來你的用例略有不同,即使演示者/視圖已被刪除,藍牙仍然連接,對嗎?無論如何,這個想法是使用Service(服務,如果它對您的問題有意義),但它們都以某種方式將數據推送到BleRepository,然後將數據傳遞給Presenter。

+0

感謝您的迴應!我試圖去適應你以前的迴應[這裏](https://stackoverflow.com/questions/43042785/android-mosby-mvi-bind-to-service-in-presenter?rq=1),但我發現它相當難。你將使用什麼作爲這個DataObservable?一些BehaviourSubject和我會每當我從設備獲得一些價值時onNext上它?還有,你會怎麼說多個dataObservables,因爲我可以讀/寫很多設備,並不是所有這些都可以很容易地映射到一種類型的對象。 – Jogosb

+0

這個答案是在你肯定不需要的綁定服務上! 當然,如果這使得它更容易比多個數據可觀察到可能是有意義的。我通常只喜歡一個,但這取決於數據,我不知道你到底在做什麼。看看PublishRelay(而不是BehaviorSubject) – sockeqwe