【问题标题】:Where to Save ViewModel State in Android's MVVM?Android 的 MVVM 中的 ViewModel 状态保存在哪里?
【发布时间】:2021-03-30 07:00:13
【问题描述】:

作为 Android 开发的初学者,我试图通过将我的第一个应用程序转换为推荐的 MVVM 结构来清理我的代码库。我目前所坚持的是试图找出存储我的视图模型状态的最佳方法。

在这个例子中,我需要存储的状态只是一个字符串的 ArrayList(表示选中了 recyclerview 中的哪些复选框)。我目前将此 ArrayList 作为一个字段存储在我的 ViewModel 中,包装在我的活动观察到的 MutableLivedata 对象中。从长远来看,这种将 ViewModel 状态存储为字段的方法似乎不可行。我可以想象随着我的应用程序的增长,我的 ViewModel 类会变得非常臃肿和混乱。

我目前使用 Firebase 实时数据库来存储我需要持久化的数据,并按照 Android 架构的建议通过存储库进行访问。但是,我的 ViewModel 的状态不需要在应用关闭后保留,因此为它对我的 Firebase 数据库进行网络调用绝对没有意义。

我的问题是:在哪里保存 ViewModel 的状态最有意义?我看到的半明智选项是将其保存为 ViewModel 类中的字段(我目前的方法),将其保存在 Room 数据库中(并在每次应用程序被终止时重置数据库),或将其保存为我的存储库类中的字段(似乎不正确)。我愿意接受建议!

【问题讨论】:

    标签: java android kotlin mvvm viewmodel


    【解决方案1】:

    这取决于您的需求:

    • 如果您只想为配置更改保留状态,则无需再做任何事情。 ViewModel 将为您处理。
    • 如果您想在关闭屏幕后返回该屏幕时看到相同的状态,那么我建议使用本地缓存解决方案,例如 Room。您可以在房间顶部创建一个存储库并将其注入您的 Viewmodel。
    • 如果您想保持状态直到应用程序关闭,您还可以创建一个内存存储库(带有状态的单例存储库)。当应用程序被杀死时,内存将被操作系统回收,以便它们被清除。

    无论如何,远程存储数据似乎不是您正在寻找的解决方案。

    由于 Android 系统内存回收情况,我也不会依赖内存缓存解决方案。

    您可以使用缓存解决方案,并在再次打开应用时清除缓存。

    【讨论】:

    • 哈肯,感谢您的回答。当您说将状态保存在内存存储库中时,您的意思是简单地将状态保存为存储库类中的字段吗?
    • 是的。但是,您还应该注意,如果您的应用程序在您切换到另一个应用程序时停止,Android 系统可能会因内存压力而终止您的应用程序以释放一些内存。在这种情况下,由于您的应用程序被杀死,您在内存状态中的单例也将被清除。正如我在答案中添加的那样,根据您的需要,缓存解决方案可能是更好的选择。您可以在每次打开应用时清除本地状态。
    • Hakan,有帮助,谢谢。我了解当 Android 系统终止应用程序时,将状态保存为存储库或视图模型中的字段不会持久。这是可以接受的,也是目前我保存视图状态的方式,我只是不确定其他开发人员是如何做到的。
    猜你喜欢
    • 1970-01-01
    • 2016-08-15
    • 2018-11-19
    • 2021-09-27
    • 1970-01-01
    • 2019-08-27
    • 2022-08-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多