firebase - 为什么 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 的变化?
解决方案
你可以这样做,but getValue()
传递一个类对象实际上有点慢(尤其是第一次,对于一个特定的类),因为 SDK 必须使用反射来确定如何将所有字段映射到它创建的对象中。 Java 反射以相当慢而著称。但这取决于您要使用什么。
推荐阅读
- ssh - 如何在 Github Actions 中使用 ssh 身份文件
- javascript - 未选中的 Vuetify v-checkbox 图标没有为 Font Awesome 4 应用正确的类
- dictionary - 是否可以创建一个可以验证哈希图/字典而不是对象的 JSON 模式?
- c++ - 我的叉子输出不正确
- c++ - 使用单个 makefile 编译 C 和 C++
- python - Geopandas 中的自定义 Choropleth 标签
- javascript - 如何过滤表示对象的字符串
- python - 如何使用虚拟环境调试 python 函数应用程序
- javascript - 我如何编辑这个以展开 onmouseenter 和折叠 onmouseleave
- c++ - 使用 Caffe 和 CUDA 的 C++ 程序