【问题标题】:SavedStateHandle does not persist dataSavedStateHandle 不持久化数据
【发布时间】:2021-10-09 10:08:18
【问题描述】:

我按照以下页面中的说明创建了一个 viewModel,但是当我关闭应用并再次打开它时,SavedStateHandle 不起作用。

这是页面:

Saved State module for ViewModel

这是我的视图模型类:

class UserViewModel(private val state : SavedStateHandle) : ViewModel(){
    val userId: LiveData<String> by lazy {
         state.getLiveData("userId")
    }
    fun setUserId(userId : String) {
        state["userId"] = userId
    }
    val user : User by lazy {
        User("")
    } }

这是我在活动中使用 viewModel 的方式。

val userViewModel :  UserViewModel by viewModels()

我什至在我的活动中尝试过这个,但这也不起作用!

val userViewModel: UserViewModel by viewModels {
            SavedStateViewModelFactory(
                application,
                this
            )

我应该怎么做才能将数据保存在SavedStateHandle 中?我的意思是,打开应用后state还是空的。

【问题讨论】:

    标签: android-viewmodel android-savedstate viewmodel-savedstate


    【解决方案1】:

    在您链接的文档中,您可以在User-initiated UI-state dismissal 下阅读:

    在这些完全解雇的情况下,用户的假设是他们已经永久地离开了活动,如果他们重新打开活动,他们希望活动从干净的状态开始。这些解除场景的底层系统行为符合用户的期望 - 活动实例将被销毁并从内存中删除,以及存储在其中的任何状态以及与活动关联的任何已保存的实例状态记录。

    来自https://developer.android.com/topic/libraries/architecture/saving-states#use_onsaveinstancestate_as_backup_to_handle_system-initiated_process_death

    所以你误解了 SavedStateHandle 和 ViewModel 的意图和范围。如果在用户启动 UI 状态解除后恢复状态对您的应用程序非常重要,那么我建议首先关注将状态保留到磁盘(数据库、文件、SharedPreferences 等)并在适当时恢复 - 然后再考虑通过以下方式促进更流畅的 UX利用 ViewModel 中的 SavedStateHandle 等功能。

    【讨论】:

    • 感谢您的回答。那么SavedStateHandle有什么用呢?我的视图模型的工作原理是一样的,无论有没有它!例如,为了处理方向变化,我不需要SavedStateHandle。那么我应该什么时候使用呢?
    • 但是我很确定即使在进程被杀死之后也可以保存状态。看看这个代码实验室:developer.android.com/codelabs/android-lifecycles#6。错了吗?
    • 好的,我又看了一遍,现在我很确定你错了:developer.android.com/topic/libraries/architecture/…。它用于在进程死亡时保留值
    • 这取决于你如何杀死应用程序。如果您使用命令行来杀死类似于操作系统的进程,那么是的 SavedStateHandle 应该发挥作用。如果用户这样做(您是用户),那么就像我链接中的表格显示它不会发挥作用。
    【解决方案2】:

    ---- 编辑:----

    系统似乎分两步释放内存,而 SavedStateHandle 只在第一步中持久化数据:

    1. 系统终止进程。应用程序保留在最近的屏幕中。数据由 SavedStateHandle 持久化(或者在 EditText 的情况下由 savedInstanceState 中的视图持久化,参见代码实验室)。
    2. 系统完成应用程序。应用程序从最近的屏幕中删除。 SavedStateHandle 中的数据消失了,就像用户完成了应用一样。

    结论:如果您想在第 2 步中持久化数据,请使用比 SavedStateHandle 更持久的东西。

    ----结束编辑----

    我做了与代码实验室 (https://developer.android.com/codelabs/android-lifecycles#6) 类似的事情。

    正如 OP 所述,将 LiveData 存储在 SavedStateHandle 中没有任何区别(对我而言)。当系统完成应用程序(已编辑,原始文本为:终止进程)时,存储在 SavedStateHandle 中的 LiveData 消失了。

    我没有更改任何依赖项。我在Arctic Fox 2020.3.1(底部导航模板)中使用了一个模板。它可以很好地编译将 SavedStateHandle 添加到 AndroidViewModel 子类,但它不会保存 LiveData。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多