【发布时间】:2023-03-09 02:11:01
【问题描述】:
我对使用 MVVM 架构感到困惑!在某些教程中,LiveData 存储在存储库中,然后传递给ViewModel。在许多其他情况下,LiveData 是在存储库的函数中定义的,并使用函数的结果传递给ViewModel。但是Google says:
在您的数据层类中使用 LiveData 对象可能很诱人,但 LiveData 并非旨在处理异步数据流。 ........ 如果您需要在应用程序的其他层中使用数据流,请考虑使用 Kotlin Flows,然后使用 asLiveData() 在 ViewModel 中将它们转换为 LiveData。 .... 对于使用 Java 构建的代码库,请考虑将 Executors 与回调或 RxJava 结合使用。
我更喜欢使用 Kotlin coroutines 或 Flows。但我不知道在我的情况下是否真的需要。我正在开发一个聊天应用程序。当接收到消息时,将在存储库中调用侦听器并在其中接收消息数据。 (监听器在后台线程中运行)现在我想将消息对象发送到ViewModel,并将其添加到存储消息列表的LiveData。
object ChatsRepo {
fun listen(socket: Socket) {
socket.on(Config.ON_MESSAGE, onMessage)
}
fun sendMessage(socket: Socket, json: String) {
socket.emit(Config.ON_MESSAGE, json)
}
private val onMessage = Emitter.Listener { args: Array<Any> ->
//This message object must be sent to ViewModel
val message = Gson().fromJson(args[0].toString(), Message::class.java)
}
}
我可以使用高阶函数轻松做到这一点:
object ChatsRepo {
lateinit var listener: (Message) -> Unit
private val onMessage = Emitter.Listener { args: Array<Any> ->
val message = Gson().fromJson(args[0].toString(), Message::class.java)
listener(message)
}
}
但是使用 Kotlin 是 coroutines 还是 Flows 更好?在某些类似的情况下,需要将列表发送到ViewModel。
【问题讨论】:
标签: android kotlin mvvm kotlin-coroutines android-livedata