【问题标题】:Bluetooth SPP + Android MVVM + Coroutines蓝牙 SPP + Android MVVM + 协程
【发布时间】:2021-01-27 00:28:35
【问题描述】:

我正在创建一个应用程序以通过蓝牙与外部设备进行通信,该连接使用串行协议 (rfcomm)。幸运的是,我在 GitHub 上找到了一个名为 BlueFlow 的好库,完全用 Kotlin 和协程编写。我想实现 android dev 门户中建议的 MVVM 模式,但我不知道哪个是蓝牙的正确角色。

我有一个基本活动和一个片段,我想在其中管理 ui 组件,并且我想使用数据绑定更新 ui 的文本字段。 我想我需要在 LiveData 类型的 ViewModel 中创建一个变量,并在片段中观察它以进行更改。

蓝牙库有一个我在 ViewModel 中实例化的单例类,我需要向它传递一个上下文。蓝牙类有一个读取传入数据“readByteArray”的函数,它返回一个Flow<ByteArray>。我想这是 MVVM 架构中的“远程数据源”,对吗?然后我需要在它之上构建一个存储库。这是第一个绊脚石,我如何在这里使用函数 readByteArray ?我不能在不传递上下文的情况下使用单例,我认为在这部分架构中使用上下文并不好。 我还为接收到的数据编写了一个模型类,就像:

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

我需要这个类,因为有时我必须将这些数据保存到房间数据库中。

我非常感谢任何帮助/建议。我从一个星期以来一直在努力解决这个问题,但没有找到解决方案。这就是我认为应该在我的项目中实现 MVVM 的方式,但我不确定它是否正确:

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

【问题讨论】:

    标签: android kotlin bluetooth kotlin-coroutines


    【解决方案1】:

    您不需要到处使用 LiveData,只有在必须观察它或不断更新 UI 时才使用它,就像您想在变量中使用它一样,当您必须从 UI 中获取实时数据(如 editText)时。你可以在你的项目中到处使用liveData,你要不要使用它,我建议你在选择的时候要寻找它的必要性。

    您对 readByteArray 的看法是正确的,因为它是我们正在使用的数据源,因此它被视为 MVVM 中的存储库。

    【讨论】:

    • 感谢您的回复,但您没有回答我的问题。你认为我应该把这个场景的各种“演员”放在哪里?有些事情发生了变化,我需要在许多活动和片段中从蓝牙发送/接收数据。这如何在 MVVM 架构中完成?我想使用基本活动,但我不确定这是正确的方法。
    • 然后您必须将 LiveData 视为存储库并将其放在存储库文件夹中,特别是在单例类(也称为对象类)中,以便我们可以从我们需要的每个类中生成对象类将获得相同的对象。并从那里使用它。
    猜你喜欢
    • 2017-12-14
    • 2016-07-28
    • 2011-05-01
    • 2013-03-10
    • 1970-01-01
    • 1970-01-01
    • 2012-08-29
    • 2015-11-12
    • 1970-01-01
    相关资源
    最近更新 更多