簡體   English   中英

藍牙 SPP + Android MVVM + 協程

[英]Bluetooth SPP + Android MVVM + Coroutines

我正在創建一個應用程序來通過藍牙與外部設備通信,連接是使用串行協議(rfcomm)。 幸運的是,我在 GitHub 上找到了一個很好的庫,名為BlueFlow ,完全用 Kotlin 和協程編寫。 我想實現 android 開發門戶中建議的 MVVM 模式,但我不知道哪個是藍牙的正確角色。

我有一個基本活動和一個片段,我想在其中管理 ui 組件,並且我想使用數據綁定更新 ui 的文本字段。 我想我需要在 LiveData 類型的 ViewModel 中創建一個變量,並在片段中觀察它以進行更改。

藍牙庫有一個 singleton class 我在 ViewModel 中實例化,我需要向它傳遞一個上下文。 藍牙 class 有一個 function 用於讀取傳入數據“readByteArray”,它返回一個Flow<ByteArray> 我想這是 MVVM 架構中的“遠程數據源”,對嗎? 然后我需要在它之上構建一個存儲庫。 這里有第一個絆腳石,我如何在這里使用 function readByteArray? 我不能在沒有傳遞上下文的情況下使用 singleton,我認為在這部分架構中使用上下文並不好。 我還為收到的數據寫了一個 model class ,它就像:

    @Parcelize
data class IncomingResult(
        @SerializedName("battery")
        val battery: Int,
        @SerializedName("sensor_one")
        val sensorOne: Int,
        @SerializedName("sensor_two")
        val sensorTwo: Int,
): Parcelable

我需要這個 class 因為有時我必須將這些數據保存到房間數據庫中。

我非常感謝任何幫助/建議。 我從一個星期以來一直在努力解決這個問題,但沒有找到解決方案。 這就是我認為應該在我的項目中實現 MVVM 的方式,但我不確定它是否正確:

            Fragment
                |
                |
            ViewModel
                |
                |
            Repository
                |
    __________  |   _________
    |                       |
    |                       |
Room Database           Bluetooth 
                        incoming data

您不需要到處使用 LiveData,只有當您必須從 UI 中獲取實時數據(如 editText)時,才需要觀察它或不斷更新 UI,就像您想在變量中使用它一樣。 你可以在你的項目中到處使用liveData,你要不要使用它取決於你,我建議你在選擇它時要尋找必要性。

您對 readByteArray 的看法是正確的,因為它是我們正在使用的數據源,因此它被視為 MVVM 中的存儲庫。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM