首页 > 解决方案 > 为什么 dataSnapshot 在 ViewModel 中反序列化,而不是在扩展 LiveData 的类中?

问题描述

我阅读了 Doug Stevenson第 1部分、第 2部分、第 3部分撰写的这些博客文章。在第 2 部分,他说

实时数据库 SDK 使将 DataSnapshot 转换为 JavaBean 样式对象变得非常容易

并提到我们可以使用这行代码将 DataSnapshot 反序列化为 HotStock 对象(JavaBean 类)

HotStock 股票 = dataSnapshot.getValue(HotStock.class)

我很困惑,因为他首先使用 Transformation.map,然后他说如果 LiveData 转换很昂贵,我们可以从 ViewModel 创建一个 MediatorLiveData 对象,以将 DataSnapshot 转换为 HotStock 对象。

我的问题是:为什么我们不能直接调用

HotStock 股票 = dataSnapshot.getValue(HotStock.class)

来自 ValueEventListener 上的 onDataChange() 方法,该方法位于扩展 LiveData 超类的类中,然后简单地使用 setValue() 方法将 HotStock 对象直接传递给 ViewModel,然后传递给 Activity 或 Fragment 观察 LiveData 的变化?

标签: firebasefirebase-realtime-databaseviewmodelandroid-livedata

解决方案


你可以这样做,but getValue()传递一个类对象实际上有点慢(尤其是第一次,对于一个特定的类),因为 SDK 必须使用反射来确定如何将所有字段映射到它创建的对象中。 Java 反射以相当慢而著称。但这取决于您要使用什么。


推荐阅读