首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >片段-在活动的onDestroy之后保存/恢复模型的最好方法?

片段-在活动的onDestroy之后保存/恢复模型的最好方法?
EN

Stack Overflow用户
提问于 2018-05-27 23:14:04
回答 1查看 268关注 0票数 0

我有一个驻留在活动内部的片段。当用户按下back按钮时,我需要保存模型数据,以便下次用户打开片段/活动时可以使用。但只要在应用程序中,它就不需要持久存储在磁盘上。例如,如果用户破坏了进程,则不需要保留模型数据,可以再次从网络中获取这些数据。

我尝试过的方法:icePickonSavedInstance调用,但当用户按下片段上的后退按钮时,这些调用似乎不起作用。如果我错了,请告诉我。

下面是我在片段中实现的内容:

代码语言:javascript
复制
 @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
           outState.putParcelable("myModel", Parcels.wrap(myModel));
    }

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

我有一个想法是使用数据库来做这件事,但我只是在内存中需要它,应该有一种方法可以在没有数据库的情况下做到这一点。

根据我所了解到的,如果用户点击后退按钮,系统将不会调用onSaveInstance:

如果某个活动位于前台,并且用户点击了Back按钮,则该活动将通过onPause()、onStop()和onDestroy()回调进行转换。除了被销毁之外,该活动还会从后台堆栈中删除。

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

来源:here

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-27 23:51:00

片段的#onSaveInstanceState严格耦合到活动生命周期

According to doc

调用

以在被终止之前从活动中检索每个实例的状态

您只对片段进行操作,活动保持不变,因此此方法肯定不能在您的情况下使用,也不应该使用。

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50553577

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档