【问题标题】:fragment - best way to save/restore model after onDestroy of activity?片段 - onDestroy 活动后保存/恢复模型的最佳方法?
【发布时间】:2018-05-28 10:00:00
【问题描述】:

我有一个托管在活动内部的片段。当用户按下后退按钮时,我需要保存模型数据并在下次用户打开片段/活动时使其可用。但就在应用程序中,它不需要持久化到磁盘。因此,例如如果用户破坏了进程,则无需保留模型数据,可以再次从网络中获取。

我尝试过的: icePickonSavedInstance 调用,但是当用户按下片段上的后退按钮时,这些似乎并没有启动。告诉我我是否错了。

这是我在片段中实现的:

 @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
           outState.putParcelable("myModel", Parcels.wrap(myModel));
    }

如果这有什么不同,我正在使用parceler 库。如果需要,我还可以将代码转换为 kotlin。 当我点击后退按钮时,片段会从堆栈中弹出,包含它的活动会调用 onDestroy,但我在 onSaveInstanceState 中没有得到任何回调。此外,当我签入onCreate() savedInstanceState 时为空。 我没有在活动中覆盖onSavedInstance,只是在片段中。我究竟做错了什么 ?

虽然我想使用数据库来执行此操作,但我只需要在内存中使用它,并且应该有一种方法可以在没有数据库的情况下执行此操作。

据我所知,如果用户点击后退按钮 onSaveInstance 不会被系统调用:

如果一个活动在前台,并且用户点击返回按钮,活动将通过 onPause()、onStop() 和 onDestroy() 回调进行转换。除了被销毁之外,Activity 也会从返回栈中移除。

需要注意的是,默认情况下,onSaveInstanceState() 在这种情况下不会触发回调。

来源:here

【问题讨论】:

  • 您想要应用程序生命周期的数据持久性?单身人士?
  • 我试图避免这种模式,因为它使事情难以测试。但也是个好主意
  • onSaveInstanceState() 仅在活动被临时销毁时调用,例如在方向更改期间,因此您需要在片段的 onPause() 方法中显式调用 onSaveInstanceState(),因为不能保证 onDestroy()总是被调用。
  • 我尝试在片段的 ondestroy() 中调用 onSaveInstanceState()。它被调用(按下后退按钮)但下次我加载活动时,捆绑包仍然为空。我不能手动调用它吗?在 api 27 上测试

标签: android android-fragments


【解决方案1】:

fragment的#onSaveInstanceState与activity生命周期严格耦合
According to doc

在被调用之前从活动中检索每个实例的状态 杀了

您仅使用片段进行操作,并且活动保持不变, 所以这种方法绝对不能在你的情况下使用,也不应该。

我的建议是通过接口使用某种持久存储。它可以在内存存储中(任何类型的单例,如 cmets 中建议的那样。它可以限定为应用程序或活动或自定义案例(您必须手动控制缓存生命周期)并注入匕首),共享首选项基于存储,数据库存储。如果您遵循依赖注入模式并使用像 MVP 这样的结构模式,很容易测试(但这不是这个问题的重点)

因此,将数据存储在存储库中的更改或onPause 方法中(因为它是最后一个保证在屏幕消失时调用的方法)。并恢复到onCreate

【讨论】:

  • 我正在使用存储库设计模式。我的存储库目前仅适用于网络。我怎样才能让它在网络和内存或数据库之间切换?你知道我能看到的任何可行的例子吗?
  • 我认为关键是使用基于时间的缓存。在存储库级别上,您对 ui 层一无所知,因此您只能使用先前从网络获取的时间来操作数。在这里发布完整的实现太宽泛了(因为它通常基于你使用的框架),但主要思想是有缓存生命周期,检查它是否在之前的数据获取后通过并再次从网络加载它或者从缓存中加载它。您可以根据业务需求使用缓存生命周期
  • 我最终将 json 写入磁盘并在之后将其转换回对象。也感谢存储库模式的想法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-02-10
  • 1970-01-01
  • 2020-01-22
  • 2020-03-20
  • 1970-01-01
  • 2020-04-03
  • 2020-04-13
相关资源
最近更新 更多